Arrays Go:如何获得函数中切片的长度?

Arrays Go:如何获得函数中切片的长度?,arrays,function,go,Arrays,Function,Go,我有一个函数,我想输入不同类型的切片,然后我想循环它们并打印它们的内容。以下代码起作用: func plot(data interface{}){ fmt.Println(data) //fmt.Println(len(data)) } func main() { l := []int{1, 4, 3} plot(l) } 但是,当我取消对打印切片长度的行的注释时,我得到一个错误,即len的参数数据无效(type interface{}) 你知道我怎样才能得到

我有一个函数,我想输入不同类型的切片,然后我想循环它们并打印它们的内容。以下代码起作用:

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

func main() {
    l := []int{1, 4, 3}
    plot(l)
}
但是,当我取消对打印切片长度的行的注释时,我得到一个错误,即len的
参数数据无效(type interface{})


你知道我怎样才能得到切片的长度,这样我就可以在它上面循环吗?

你应该尽可能避免使用接口{}。你想做的事可以通过反思来完成,但反思是一种必要的邪恶。它确实有利于编组,但应谨慎使用。如果仍要使用reflect,可以执行以下操作:

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)
        ...
    }
}
func绘图(数据接口{}){
s:=反射.ValueOf(数据)
如果s.Kind()!=reflect.Slice{
恐慌(“给定非切片类型的plot())
}
对于i:=0;i

即使这样做了,v也是a。然后,您需要以某种方式将其转换为有用的内容。幸运的是,Value有许多方法可以用来转换它。在这种情况下,
v.Int()
将以int64的形式返回值。

如注释所示,您必须使用反射来执行此操作,如下所示:

var sliceLen int

switch reflect.TypeOf(data).Kind() {

    case reflect.Slice:
        sliceLen = s.Len();
    default:
        //error here, unexpected
    }
}

虽然GO提供了在需要的时候做这些小技巧的反射(以及许多其他用途),但是最好避免在任何可能的情况下保持编译器类型的安全性和性能,考虑在这个方法上对不同的数据类型具有不同功能的优点/缺点。“我想喂不同种类的鱼片“。如果参数是空接口,则必须使用

reflect
包执行所需操作。看见您可能需要考虑定义一个特定的接口,该接口定义了一些方法,这些方法可以对传入的对象执行您需要执行的任何操作。如果您使用的是不同类型的切片,那么您必须已经在使用反射或将其断言为具体类型。您是如何使用无法获得长度的
数据的?在
func plot(数据接口{},长度int)
中传递长度不是更容易吗?在传递它之前,假设它不是
接口{}
类型。可能是