【发布时间】:2014-08-13 13:12:52
【问题描述】:
我有以下代码:
v: = &[]interface{}{client, &client.Id}
valType := reflect.TypeOf(v)
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
elm := val.Elem()
if elm.Kind() == reflect.Slice {
fmt.Println("Type ->>", elm, " - ", valType.Elem())
}
}
输出如下:Type ->> <[]interface {} Value> - []interface {}
我怎样才能得到它的底层类型?我想检查数组类型是否属于 interface{} 类型。
编辑 实现它的一种方法,恕我直言,这是一种丑陋的方法:
var t []interface{}
fmt.Println("Type ->>", elm, " - ", valType.Elem(), " --- ", reflect.TypeOf(t) == valType.Elem())
可以用不同的方式完成吗?
【问题讨论】:
-
切片的类型为
[]inteface{},因此底层类型为interface{}。这意味着它可以包含任何东西。如果你想要 每个元素 的底层类型,你需要检查每个元素。 -
试试 v := &[]Foo{...} 看看有什么不同。
-
我不知道有更好的方法来获取代表
interface{}类型的reflect对象,而不是像你正在做的那样使用它的实例。可能能够避免reflect:使用可能代表*[]interface{}或*[]Foo的var ifc interface{},您可以随时使用_, ok := ifc.(*[]interface{})并检查ok以查看您的类型是否正确,或者做一个类型切换(检查那些规范)。另外,请注意a slice already contains a pointer to the data so you rarely need slice pointers。 -
但是如何使用反射检索数组类型。让我们假设我们有 v := make([]Foo, 0)。如何获取 Foo 类型而不是 []Foo?
-
@MihaiH 很高兴您显然找到了答案。看来您忘记提供答案并接受了!
标签: go reflection slice