我有一个函数,我想向其提供不同类型的 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/