reflect golang example go reflection slice go-reflect

golang - rango sobre la interfaz{} que almacena una porción



golang reflect (2)

Dado el escenario en el que tiene una función que acepta t interface{} . Si se determina que la t es una porción, ¿cómo range sobre esa porción? No sabré el tipo entrante, como []string , []int o []MyType , en tiempo de compilación.

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) } } }

Ejemplo de Go Playground: http://play.golang.org/p/DNldAlNShB


Bueno, utilicé reflect.ValueOf y luego, si se trata de una porción, puede llamar a Len() e Index() sobre el valor para obtener la len del sector y el elemento en un índice. No creo que puedas usar el rango para hacer esto.

package main import "fmt" import "reflect" func main() { data := []string{"one","two","three"} test(data) moredata := []int{1,2,3} test(moredata) } func test(t interface{}) { switch reflect.TypeOf(t).Kind() { case reflect.Slice: s := reflect.ValueOf(t) for i := 0; i < s.Len(); i++ { fmt.Println(s.Index(i)) } } }

Ejemplo de Go Playground: http://play.golang.org/p/gQhCTiwPAq


No necesita usar el reflejo , puede usar un interruptor de tipo simple para hacer eso. Me gusta esto:

package main import "fmt" func main() { loop([]string{"one", "two", "three"}) loop([]int{1, 2, 3}) } func loop(t interface{}) { switch t := t.(type) { case []string: for _, value := range t { fmt.Println(value) } case []int: for _, value := range t { fmt.Println(value) } } }

Mira el código en el patio de recreo .