Compte tenu du scénario où vous avez une fonction qui accepte t interface{}
. S'il est déterminé que le t
est une tranche, comment puis-je range
sur cette tranche?
func main() {
data := []string{"one","two","three"}
test(data)
moredata := []int{1,2,3}
test(data)
}
func test(t interface{}) {
switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
// how do I iterate here?
for _,value := range t {
fmt.Println(value)
}
}
}
Exemple Go Playground: http://play.golang.org/p/DNldAlNShB
go
reflection
slice
go-reflect
Nucléon
la source
la source
Réponses:
Eh bien, j'ai utilisé
reflect.ValueOf
et puis si c'est une tranche, vous pouvez appelerLen()
etIndex()
sur la valeur pour obtenirlen
la tranche et l'élément à un index. Je ne pense pas que vous pourrez utiliser la gamme pour faire cela.Exemple Go Playground: http://play.golang.org/p/gQhCTiwPAq
la source
s.Index(i)
renvoie unreflect.Value
donc dans mon cas, j'avais besoins.Index(i).Interface()
de référencer la valeur réelle.interface{}
? egmoredata := &[]int{1,2,3}
Elem()
pour obtenir la valeur sous-jacente. egreflect.TypeOf(reflect.ValueOf(t).Elem().Interface()).Kind()
Vous n'avez pas besoin d'utiliser la réflexion si vous savez à quels types vous attendre. Vous pouvez utiliser un commutateur de type , comme ceci:
Consultez le code sur le terrain de jeu .
la source
array[:]
.il y a une exception à la façon dont l'interface {} se comporte, @Jeremy Wall a déjà donné un pointeur. si les données passées sont définies comme [] interface {} initialement.
production:
Essaye le
la source