Nuc*_*eon 76 reflection go slice go-reflect
鉴于你有一个接受的功能的场景t interface{}
.如果确定t
是切片,我range
该如何切片?我不会知道传入的类型,例如[]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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
mas*_*ase 114
好吧,我使用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))
}
}
}
Run Code Online (Sandbox Code Playgroud)
去游乐场示例:http://play.golang.org/p/gQhCTiwPAq
Ina*_*mus 16
如果您知道要使用哪种类型,则无需使用反射.您可以使用类型开关,如下所示:
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
扩展 masebase 提供的答案,您可以interface{}
使用如下函数概括切片上的迭代:
func forEachValue(ifaceSlice interface{}, f func(i int, val interface{})) {
v := reflect.ValueOf(ifaceSlice)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Slice {
panic(fmt.Errorf("forEachValue: expected slice type, found %q", v.Kind().String()))
}
for i := 0; i < v.Len(); i++ {
val := v.Index(i).Interface()
f(i, val)
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样使用它:
func main() {
data := []string{"one","two","three"}
test(data)
moredata := []int{1,2,3}
test(data)
}
func test(sliceIface interface{}) {
forEachValue(sliceIface, func(i int, value interface{}) {
fmt.Println(value)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53929 次 |
最近记录: |