如何使用匿名字段(或超类)获取正确的结构类型?
我试图让这条鱼形容自己是一个鳕鱼:
package main
import (
"fmt"
"reflect"
)
type Fish struct {
}
func (self *Fish) WhatAmI() string {
return reflect.TypeOf(self).String()
}
type Cod struct {
Fish
}
func main() {
c := new(Cod)
fmt.Println("I am a", c.WhatAmI())
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
I am a *main.Fish
Run Code Online (Sandbox Code Playgroud)
我想要的是:
I am a *main.Cod
Run Code Online (Sandbox Code Playgroud)
您在得到正确的答案.你想得到的答案是错误的.
在
func (f *Fish) WhatAmI() string {
return reflect.TypeOf(f).String()
}
Run Code Online (Sandbox Code Playgroud)
f 是类型*main.Fish,它甚至被声明为该类型(f *Fish).因此,它不能永远是类型*main.Cod.
可能的混淆源:方法集Cod继承其嵌入的匿名字段的方法集,Fish并且不会覆盖它.因此调用WhatAmI一个Cod"委托" 实例调用Fish.WhatAmI,但接收器现在是嵌入式字段*main.Fish.
覆盖继承方法的示例:
package main
import (
"fmt"
)
type Fish struct {
}
func (f *Fish) WhatAmI() string {
return fmt.Sprintf("%T", f)
}
type Cod struct {
Fish
}
func (c *Cod) WhatAmI() string {
return fmt.Sprintf("%T", c)
}
func main() {
c := new(Cod)
fmt.Println("I am a", c.WhatAmI())
}
Run Code Online (Sandbox Code Playgroud)
输出:
I am a *main.Cod
Run Code Online (Sandbox Code Playgroud)