英文:
Golang: get the type of slice
问题
我正在使用reflect包来获取任意数组的类型,但是得到了以下错误信息:
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
英文:
I am using reflect package to get the type of arbitrary array, but getting
prog.go:17: cannot use sample_array1 (type []int) as type []interface {} in function argument [process exited with non-zero status]
How do I get the type from array? I know how to get it from value.
func GetTypeArray(arr []interface{}) reflect.Type {
return reflect.TypeOf(arr[0])
}
答案1
得分: 39
你正在索引切片的事实是不安全的——如果它是空的,你将得到一个索引越界的运行时恐慌。不管怎样,这是不必要的,因为反射包的Elem()
方法可以解决这个问题:
type Type interface {
...
// Elem返回类型的元素类型。
// 如果类型的Kind不是Array、Chan、Map、Ptr或Slice,则会引发恐慌。
Elem() Type
...
}
所以,这是你想要使用的代码:
```go
func GetTypeArray(arr interface{}) reflect.Type {
return reflect.TypeOf(arr).Elem()
}
请注意,根据@tomwilde的更改,参数arr
可以是任何类型,所以你可以在运行时传递一个非切片值给GetTypeArray()
,并得到一个恐慌。
英文:
The fact that you're indexing the slice is unsafe - if it's empty, you'll get an index-out-of-range runtime panic. Regardless, it's unnecessary because of the reflect package's Elem()
method:
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
...
}
So, here's what you want to use:
func GetTypeArray(arr interface{}) reflect.Type {
return reflect.TypeOf(arr).Elem()
}
Note that, as per @tomwilde's change, the argument arr
can be of absolutely any type, so there's nothing stopping you from passing GetTypeArray()
a non-slice value at runtime and getting a panic.
答案2
得分: 4
将:
GetTypeArray(arr []interface{})
改为:
GetTypeArray(arr interface{})
顺便说一下,[]int
不是一个数组,而是一个整数的 切片。
英文:
Change:
GetTypeArray(arr []interface{})
to:
GetTypeArray(arr interface{})
By the way, []int
is not an array but a slice of integers.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论