【问题标题】:How to convert one reflect.Type to its ptr type?如何将一个 reflect.Type 转换为它的 ptr 类型?
【发布时间】:2018-12-24 23:50:46
【问题描述】:

我有一个 reflect.Type,我需要致电 MethodByName。如果该方法是在类型T 上定义的,那么找到它没有问题。如果在*T 上定义,此方法将返回无效值。所以我尝试将T 转换为*T 并失败了。这是我的工作:

首先,我尝试从类型中创建一个新值。创建后类型信息似乎丢失了。

t := reflect.TypeOf(src) // src is interface{} type
mt, exists := t.MethodByName(name)
if !exists {
    el := reflect.New(t)
    t = reflect.TypeOf(el)
    mt, exists = t.MethodByName(name)
    fmt.Println(t, mt, exists)
}

然后,我尝试直接从 src(接口类型)获取类型,也失败了。

t := reflect.TypeOf(src)
mt, exists := t.MethodByName(name)
if !exists {
    t = reflect.TypeOf(&src) // *interface{} type, not what I want
    mt, exists = t.MethodByName(name)
    fmt.Println(t, mt, exists)
}

【问题讨论】:

  • New 返回一个 reflect.Value,以它作为参数调用 TypeOf 将返回 reflect.Value 类型的 reflect.Type。 reflect.Value 有一个方法 Type,试试看。即reflect.New(t).Type() 而不是reflect.TypeOf(reflect.New(t))

标签: pointers go reflection types


【解决方案1】:

reflect.New() 返回一个reflect.Value() 类型的值。如果你将它传递给reflect.TypeOf(),那将是reflect.Value 的描述符,而不是你的*T

只需从reflect.New()返回的值调用Value.Type()

el := reflect.New(t)
t = el.Type()
mt, exists = t.MethodByName(name)
fmt.Println(t, mt, exists)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 2021-08-07
    • 2016-09-24
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2014-09-22
    相关资源
    最近更新 更多