范围覆盖存储切片的接口{}
鉴于你有一个接受t interface{}
的函数的场景。 如果确定t
是一个切片,我该如何在该切片上进行range
? 我不会在编译时知道传入的types,比如[]string
, []int
或[]MyType
。
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示例: http : //play.golang.org/p/DNldAlNShB
那么我使用reflect.ValueOf
,然后如果它是一个切片,你可以调用Len()
和Index()
来得到切片和元素在一个索引的len
。 我不认为你将能够使用范围操作来做到这一点。
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)) } } }
Go Playground示例: http : //play.golang.org/p/gQhCTiwPAq