go里面严格来说是没有继承的
所谓的继承是通过匿名字段的组合来实现的
在使用其多态的时候可能会出问题
它不像java那种, 根据实际传入的类型来选择方法
type A struct {}
type B struct {
A // 只写出类型, 没有变量名 -- > 匿名字段
}
func (p *A) Show() {
fmt.Println("start ...")
p.Show2()
}
func (p *A) Show2() {
fmt.Println("AAA")
}
func (p *B) Show2() { // 名称也是Show2 (属于结构体函数, 可以这样写, 不会报错)
fmt.Println("BBB")
}
func main() {
b := &B{}
b.Show() // 相当于b先访问了自己的匿名字段A, A再调用Show()
}
// start ...
// AAA
解析: A,B 两个都是结构体, B是有一个字段是A类型的匿名字段
这种情况下, 我们为B继承了A(其实不是真正意义上的继承, 只是匿名字段而已)
B中没有Show()方法, 但是b.Show()为什么可以执行?
其实是b.匿名字段.Show() --> 因为匿名字段没有名字, 只有将其省略, 也就相当于b.Show()
当调用:
func (p *A) Show() {
fmt.Println("start ...")
p.Show2()
}
的时候, 其实是匿名字段调用的Show(), 则p的值也就是A的实例
所以最后会调用A的Show2()函数, 这确实和java等其它的语言不同