对象:匿名嵌入和匿名字段方法

本文探讨了Go语言中匿名嵌入的概念,它允许类型组合其他类型的方法而无需继承。不能同时嵌入T和*T,因为字段名称会冲突。方法调用遵循最近原则,编译器会进行转换。Go语言强调组合而非继承,通过匿名嵌入实现类似继承的效果,并通过接口实现多态。同时,文章提到了方法遮蔽和如何实现类似`override`的功能,以及设计模式中的代理模式和Facade模式在匿名嵌入中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匿名嵌入

将其他类型匿名嵌入到复合类型,以组合方式获取方法调用权限。

  • 匿名类型字段实际以“类型”为名。
  • 不能同时嵌入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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值