Golang:获取切片的类型

15
我正在使用反射包来获取任意数组的类型,但是出现了问题。
   prog.go:17: cannot use sample_array1 (type []int) as type []interface {} in function argument [process exited with non-zero status]

如何从数组中获取类型?我知道如何从值中获取类型。

  func GetTypeArray(arr []interface{}) reflect.Type {
      return reflect.TypeOf(arr[0])
  }

http://play.golang.org/p/sNw8aL0a5f

2个回答

39

你索引切片的方式是不安全的——如果它是空的,你将会得到一个运行时索引越界的恐慌。无论如何,这是不必要的,因为在 reflect 包中有Elem()方法

type Type interface {

    ...

    // Elem returns a type's element type.
    // It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.
    Elem() Type

    ...
}

因此,这是您想要使用的内容:

func GetTypeArray(arr interface{}) reflect.Type {
      return reflect.TypeOf(arr).Elem()
}
请注意,根据@tomwilde的更改,参数arr可以是任何类型,因此在运行时您可以随意传递非切片值并通过GetTypeArray()引发恐慌。

请注意@thwd的语义注释:[]int是整数的_slice_,而不是数组。不要被这里使用的“Array”和“arr”所困惑。GetTypeArray将适用于数组或切片,因此像GetElemType这样的名称会更好。 - Nathaniel Jones

4

变更:

GetTypeArray(arr []interface{})

to:

GetTypeArray(arr interface{})

顺便说一下,[]int 不是一个数组,而是一个整数的 切片


4
这并不能解决潜在的索引越界崩溃问题。请查看我的答案。 - Mike
@Mike 尽管你的说法是正确的,但这并不是问题的关键(问题包括一个非常具体的错误需要解决),因此这超出了范围。 - thwd
3
问题的标题为“Golang, Go: 获取数组类型”,这正是我在找到它时正在寻找的。我并不是在暗示这是你的错误或者你错过了它。然而,由于我差点没有注意到这个 bug 或者这个解决方案存在缺陷,所以重要的是要解决它。我并不是想挑战你,我只是认为这很重要。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接