golang:在方法调用中找到真正的调用者

时间:2014-07-03 10:49:37

标签: reflection struct go

我有这样的结构:

type Parent struct {
    example string
}
func (p *Parent) GetMyAttr() {
    typ := reflect.TypeOf(p).Elem()

    for i := 0; i < typ.NumField(); i++ {
        p := typ.Field(i)
        if !p.Anonymous {
            fmt.Println(p.Name, ":", p.Type)
        }
    }
}

如果我有另一个这样的结构:

type Child struct {
    Parent
    another string
}

在像这样的孩子中调用GetTypeOfMe()

ch := Child{Parent{"example"},"another"}
ch.GetMyAttr()

总是返回example : string。 这是否可以使用反射在父结构中获取Child结构?

完整代码在这里http://play.golang.org/p/ej4Xh_V2J1

感谢。

2 个答案:

答案 0 :(得分:3)

不,因为您使用的是*Parent,而不是*Child 这将&#34;工作&#34; (play.golang

func (p *Child) GetMyAttr() {...

会输出:

Parent : main.Parent
another : string

Parent不知道可能嵌入它的struct,因此反射仅在Parent结构上运行。

您在&#34; Go Reflection with Embedding&#34;中看到了类似的问题,它使用interface{}来获取所有在参数中传递的结构。

答案 1 :(得分:3)

它不会像这样工作,reflect.TypeOf(p).Elem()将始终返回Parent您有2个选项,要么为每个孩子实施GetMyAttr,要么使用通用函数like

func GetAttr(i interface{}) {
    typ := reflect.Indirect(reflect.ValueOf(i)).Type()
    fmt.Println(typ)
    for i := 0; i < typ.NumField(); i++ {
        p := typ.Field(i)
        fmt.Println(p.Name, ":", p.Type)

    }
}
相关问题