In Anbetracht des Szenarios, in dem Sie eine Funktion haben, die akzeptiert t interface{}
. Wenn festgestellt wird, dass es sich um t
ein Slice handelt, wie gehe ich dann range
über dieses Slice hinaus?
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)
}
}
}
Go Playground Beispiel: http://play.golang.org/p/DNldAlNShB
go
reflection
slice
go-reflect
Nucleon
quelle
quelle
Antworten:
Nun, ich habe verwendet
reflect.ValueOf
und dann, wenn es ein Slice ist, können SieLen()
undIndex()
auf den Wert aufrufen , umlen
das Slice und Element an einem Index zu erhalten. Ich glaube nicht, dass Sie die Reichweite verwenden können, um dies zu tun.Go Playground Beispiel: http://play.golang.org/p/gQhCTiwPAq
quelle
s.Index(i)
a zurückgegeben wird.reflect.Value
In meinem Fall musste ichs.Index(i).Interface()
auf den tatsächlichen Wert verweisen.interface{}
? zBmoredata := &[]int{1,2,3}
Elem()
, um den zugrunde liegenden Wert zu erhalten. zBreflect.TypeOf(reflect.ValueOf(t).Elem().Interface()).Kind()
Sie müssen keine Reflexion verwenden, wenn Sie wissen, welche Typen zu erwarten sind. Sie können einen Typschalter wie folgt verwenden:
Überprüfen Sie den Code auf dem Spielplatz .
quelle
array[:]
.Es gibt eine Ausnahme von der Art und Weise, wie sich die Schnittstelle {} verhält. @Jeremy Wall hat bereits einen Zeiger gegeben. wenn die übergebenen Daten anfänglich als [] Schnittstelle {} definiert sind.
Ausgabe:
Versuch es
quelle