【问题标题】:Reflect slice underlying type反映切片底层类型
【发布时间】: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{}*[]Foovar 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


【解决方案1】:

假设我们有v := make([]Foo, 0)
如何获取Foo 类型而不是[]Foo

正如您所发现的,valType.Elem().Elem() 可以在您使用切片指针的情况下工作。

但对于常规切片,如“golang reflect value kind of slice”,这就足够了:

typ := reflect.TypeOf(<var>).Elem()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2019-10-04
    • 2016-12-13
    • 2015-06-02
    • 2011-03-03
    • 2015-07-08
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多