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