Go语言中如何在父结构体方法中获取子结构体名称?
问题分析
你的代码中,Child嵌入了*Parent,因此TypeName方法是从Parent提升过来的。当调用&Child{}.TypeName()时,方法的接收者是*Parent(即Child中的匿名字段),此时reflect.TypeOf(p)获取的是接收者的类型*Parent,而非外层的*Child,所以输出不符合预期。
解决方案
以下提供两种可行的解决思路:
方法1:让Parent持有子实例引用(复用性高)
修改Parent结构体,添加字段保存实现IParent的子实例,在初始化子结构体时将自身传入Parent,这样就能在TypeName方法中获取子结构体的真实类型:
package main import ( "fmt" "reflect" ) type IParent interface { TypeName() string } type Parent struct { child IParent // 保存子实例的引用 } // 初始化Parent,传入子实例 func NewParent(child IParent) *Parent { return &Parent{child: child} } func (p *Parent) TypeName() string { t := reflect.TypeOf(p.child) if t.Kind() == reflect.Ptr { return "*" + t.Elem().Name() } return t.Name() } type Child struct { *Parent } // 初始化Child,将自身传入Parent func NewChild() *Child { c := &Child{} c.Parent = NewParent(c) return c } func main() { var e IParent = NewChild() val := e.TypeName() fmt.Printf("TypeName: %v.\n", val) // 输出:TypeName: *Child. }
方法2:子结构体自行实现TypeName方法(简单直接)
如果子结构体数量不多,可以直接让每个子结构体实现TypeName方法,直接返回自身类型,避免反射:
package main import "fmt" type IParent interface { TypeName() string } type Parent struct{} type Child struct { *Parent } func (c *Child) TypeName() string { return "*Child" } func main() { var e IParent = &Child{} val := e.TypeName() fmt.Printf("TypeName: %v.\n", val) // 输出:TypeName: *Child. }
内容的提问来源于stack exchange,提问作者aiziyuer
相关产品推荐
相关产品推荐

