range over interface{} 存储切片

新手上路,请多包涵

假设您有一个接受 t interface{} 的函数。如果确定 t 是一个切片,我如何 range 覆盖该切片?

 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 游乐场示例: http ://play.golang.org/p/DNldAlNShB

原文由 Nucleon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

Well I used reflect.ValueOf and then if it is a slice you can call Len() and Index() on the value to get the len of the索引处的切片和元素。我认为您无法使用范围操作来执行此操作。

 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 游乐场示例: http ://play.golang.org/p/gQhCTiwPAq

原文由 masebase 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您知道期望的类型,则不需要使用反射。您可以使用 type switch ,如下所示:

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

查看 playground 上的代码

原文由 Inanc Gumus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏