如何将一个reflect.Type转换为其ptr类型?

时间:2018-07-17 10:06:41

标签: pointers go reflection types

我有一个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)
}

1 个答案:

答案 0 :(得分:3)

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)