代码之家  ›  专栏  ›  技术社区  ›  divflex

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

  •  1
  • divflex  · 技术社区  · 7 年前

    我有一个反映。类型和我需要打电话 MethodByName . 如果方法是在类型上定义的 T 找到它没问题。如果定义在 *T ,此mehtod将返回无效值。所以我试图改变 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 回复  |  直到 7 年前
        1
  •  3
  •   icza    7 年前

    reflect.New() 返回类型的值 reflect.Value() . 如果你把这个传给 reflect.TypeOf() ,这将是 reflect.Value ,不是您的 *T .

    打电话就行了 Value.Type() 从返回的值 反射.new() :

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