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