我有这样的结构:
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
感谢。
答案 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)
}
}