Reflection 在方法调用中查找真正的调用方

Reflection 在方法调用中查找真正的调用方,reflection,struct,go,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,

我有一个这样的结构:

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()
始终返回
示例:string
。 这是否可以在具有反射的父结构中获取子结构


完整代码在这里

否,因为您操作的是
*父项
,而不是
*子项

这将“起作用”()

将输出:

Parent : main.Parent
another : string
父级
不知道可能嵌入它的
结构
,因此反射只在
父级
结构上操作


您会看到“”也存在类似的问题,它使用
接口{}
来获取传入参数的所有结构。

否,因为您操作的是
*父级
,而不是
*子级

这将“起作用”()

将输出:

Parent : main.Parent
another : string
父级
不知道可能嵌入它的
结构
,因此反射只在
父级
结构上操作


您可以看到“”也存在类似的问题,它使用
接口{}
来获取传入参数的所有结构。

它不是这样工作的,
reflect.TypeOf(p).Elem()
将始终返回
父级
您有两个选项,要么为每个子级实现
GetMyAttr
,要么使用泛型函数:

func GetAttr(i接口{}){
类型:=reflect.Indirect(reflect.ValueOf(i)).Type()
fmt.Println(典型)
对于i:=0;i
它不是这样工作的,
reflect.TypeOf(p).Elem()
将始终返回
Parent
您有两个选项,或者为每个子级实现
GetMyAttr
,或者使用通用函数:

func GetAttr(i接口{}){
类型:=reflect.Indirect(reflect.ValueOf(i)).Type()
fmt.Println(典型)
对于i:=0;i
我有不止一个孩子,为他们中的每一个重新编写此方法不是我的选择。@fzerorubigd我理解。我只是指出了这不起作用的原因。我有不止一个孩子,为他们中的每一个重新编写此方法不是我的选择。@fzerorubigd我理解。我只是指出了为什么这不起作用。我接受这一点,因为对我来说没有更好的选择。谢谢。我接受这个,因为对我来说没有更好的选择了。非常感谢。
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)

    }
}