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)
}
}