反射切片的底层类型

5

I have the following code:

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())

有没有其他方法可以实现?


切片的类型是[]interface{},因此底层类型是interface{}。这意味着它可以包含任何内容。如果您想要每个元素的底层类型,您需要为每个元素进行检查。 - Not_a_Golfer
尝试使用 v := &[]Foo{...} 并查看差异。 - Mihai H
我不知道有什么更好的方法来获取代表interface{}类型的reflect对象,除了像你现在这样使用它的实例。也许可以避免使用reflect:通过一个var ifc interface{},它可能表示一个*[]interface{}或一个*[]Foo,你总是可以执行_, ok := ifc.(*[]interface{})并检查ok以查看是否正确获取了类型,或者进行类型开关(请查看规范)。此外,请注意,切片已经包含指向数据的指针,因此您很少需要切片指针 - twotwotwo
但是如何使用反射检索数组类型呢?假设我们有v:= make([]Foo,0)。如何获取Foo类型而不是[]Foo? - Mihai H
我真傻,找到了:valType.Elem().Elem() - Mihai H
3
@MihaiH 很好,看起来你已经找到了答案。但似乎你忘记了提供答案并接受它! - user918176
1个回答

3
假设我们有 v := make([]Foo, 0)。如何获取 Foo 类型而不是 []Foo
正如您已经发现的那样,在使用切片指针的情况下,valType.Elem().Elem() 可以起作用。
但对于常规切片,就像 "golang reflect value kind of slice" 中一样,这就足够了:
typ := reflect.TypeOf(<var>).Elem()

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