arrays - Go:如何在函数中获取 slice 的长度?

标签 arrays function go

我有一个函数,我想向其提供不同类型的 slice ,之后我想遍历它们并打印它们的内容。以下代码有效:

func plot(data interface{}){
    fmt.Println(data)
    //fmt.Println(len(data))
}

func main() {
    l := []int{1, 4, 3}
    plot(l)
}

但是,当我取消注释打印 slice 长度的那一行时,我收到一条错误消息:invalid argument data (type interface {}) for len

知道如何获取 slice 的长度以便循环遍历它吗?

最佳答案

您应该尽可能避免使用 interface{}。想做的事可以通过反射(reflection)来完成,但反射(reflection)是必要之恶。它非常适合编码,但应谨慎使用。如果你仍然想使用反射,你可以这样做:

func plot(data interface{}) {
    s := reflect.ValueOf(data)
    if s.Kind() != reflect.Slice {
        panic("plot() given a non-slice type")
    }

    for i := 0; i < s.Len(); i++ {
        v := s.Index(i)
        ...
    }
}

即使在这样做之后,v 还是一个 reflect.Value .然后,您需要以某种方式将其转换为有用的东西。幸运的是,Value 有很多方法可以用来转换它。在这种情况下,v.Int() 会将值作为 int64 返回。

关于arrays - Go:如何在函数中获取 slice 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46081296/

相关文章:

mysql - 在 Go 中使用 now() 插入日期时间

go - 从peer删除ChainCode

python - json解析django rest框架

java - 如果使用数组作为HashMap中某个键对应的值,如何获取数组的单个值?

ruby-on-rails - 将元素插入 PostgreSQL 数组而不覆盖它

javascript - 如何在 React/Jsx 的渲染中调用函数

c - 功能:变量替换

go - 为什么将值设置为结构作为映射中的值时会出现 "cannot assign"错误?

javascript - 尝试这个例子后,对 Javascript 中的 Maps 和 Set 的基础知识感到困惑

C - 无法在递归函数内进行索引