go - 存储 slice 的接口(interface){}上的范围

标签 go reflection slice go-reflect

假设您有一个接受 t interface{} 的函数。如果确定 t 是一个 slice,我如何在该 slice 上 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)
        }
    }
}

去 Playground 示例:http://play.golang.org/p/DNldAlNShB

最佳答案

好吧,我使用了 reflect.ValueOf ,然后如果它是一个 slice ,您可以在值上调用 Len()Index()在索引处获取 slice 和元素的 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))
        }
    }
}

去 Playground 示例:http://play.golang.org/p/gQhCTiwPAq

关于go - 存储 slice 的接口(interface){}上的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025833/

相关文章:

go - slice 与类型别名作为方法接收器

json - 如何在golang中打印json值

java - 按类型和值创建 Java 枚举作为字符串

java - 获取集合的通用类型而不 check out 元素

pandas - 使用 pandas 从日期时间列中选择行

arrays - 如何在没有for循环的情况下将2D slice 连接/附加到1D slice 中

arrays - 更改具有对它们的引用的动态数组是不好的做法吗?

map - 在 Go 模板中使用 map

go - 如何在 go 框架中为不同的测试执行测试顺序?

reflection - 不在JVM上运行时,如何通过名称获取对Kotlin KClass的引用?