匿名嵌入
将其他类型匿名嵌入到复合类型,以组合方式获取方法调用权限。
- 匿名类型字段实际以“类型”为名。
- 不能同时嵌入T和*T。
- 方法名存在遮蔽,以“最近”为准。
- 组合和调用语法糖,不是继承。
OOP三大基本规则封装继承多态,继承很多语言都放弃了,涉及到很多概念比如抽象类型、覆盖、重写。Go语言组合优先于继承。
所谓的匿名嵌入就是没有给字段名字只给类型。然后用语法糖的概念来实现类似继承的概念。用组合的方式来实现继承的能力。匿名嵌入后,Y可以用简短模式调用X的方法。
不能同时嵌入T和*T
type X int
type A struct {
X
*X // duplicate field X
}
因为它们名字相同,结构体不允许有多个相同名字的字段。
嵌入X和*X名字都是X,如果同时嵌入就会重名,同时嵌入一个类型和它的指针类型那是不行的。在设计层面嵌入这两个类型实际上都是嵌入X的类型,目的是为了访问方法权限,在实现层面区别在于这个字段怎么存储,内存结构不一样,指针是8字节。这和初始化方式有很大关系。
匿名字段方法
type A int
//go:noinline
func (A) a() { println("A.a