【发布时间】: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