Ten komunikat o błędzie pojawia się b/c nie ma rozsądny sposób przekonwertować []int
do []interface{}
. Uwaga, dotyczy to plasterka. Tak więc składnia, której używasz, jest poprawna, ale fmt.Scanln
oczekuje []interface{}
. Ma to wpływ poza pkg fmt
.
Powodem, dla którego widziałem, jest to, że Go zapewnia kontrolę nad układem pamięci, więc obecnie nie ma rozsądnego sposobu na konwersję plastra. Oznacza to, że musisz ręcznie wykonać konwersję, zanim przekażesz ją do funkcji oczekującej plastra danego typu. Na przykład:
package main
import (
"fmt"
)
func main() {
x := make([]int, 3)
y := make([]interface{}, 3)
y[0] = x[0]
y[1] = x[1]
y[2] = x[2]
fmt.Println(y...)
}
lub coś trochę bardziej ogólnie:
x := make([]int, 3)
y := make([]interface{}, len(x))
for i, v := range x {
y[i] = v
}
fmt.Println(y...)
Odnośnie konkretnego problemu, zobacz:
x := make([]*int, 3)
for i := range x {
x[i] = new(int)
}
y := make([]interface{}, 3)
for i, v := range x {
y[i] = v
}
if _, err := fmt.Scanln(y...); err != nil {
fmt.Println("Scanln err: ", err)
}
for _, v := range y {
val := v.(*int)
fmt.Println(*val)
}
dlaczego nie powoduje to wyniku wyjściowego '[3, 3, 3]'? 'x' będzie intializowane z' 0', które wszystkie wskazują na ten sam adres, gdy testowałem w 'main' func. – dskinner
Widzę, adres '& x [i]' jest unikalny, ale jeśli iteracja z 'dla i, v: = zakres x {...}', adres 'v' nie jest unikalny. – dskinner
co, jeśli zamiast długości 3 moje dane wejściowe nie są statyczne ?. tzn. czasami '' '[1]' '' a czasami '' '[1,2,3,4,5]' '' – javidazac