Go 中关于方法的 receiver 的总结

关于这部分内容,在写代码时一直都是用指针类型的 receiver,但没有系统整理过规则,这里进行总结。

首先是官方 FAQ 中说的那三条:

第一条也是最重要的一条,方法是否要修改 receiver?
其次是效率的考虑,如果 receiver 非常大,比如说一个大 struct,使用指针将非常合适。
接下来是一致性,如果该类型的某些方法必须使用指针 receiver,剩下的也要使用指针。不论使用什么类型的 receiver,方法集要一致。

还有一些其它的规则:

实例和实例指针可以调用值类型和指针类型 receiver 的方法。
如果通过 method express 方式,struct 值只能调用值类型 receiver 的方法,而 struct 指针是能调用值类型和指针类型 receiver 的方法的。
如果 receiver 是 map、func 或 chan,不要使用指针。
如果 receiver 是 slice,并且方法不会重新分配 slice,不要使用指针。
如果 receiver 是包含 sync.Mutex 或其它类似的同步字段的结构体,receiver 必须是指针,以避免复制。
如果 receiver 是大 struct 或 array,receiver 用指针效率会更高。那么,多大是大?假设要把它的所有元素作为参数传递给方法,如果这样会感觉太大,那对 receiver 来说也就太大了。
如果 receiver 是 struct、array 或 slice,并且它的任何元素都是可能发生改变的内容的指针,最好使用指针类型的 receiver,这会使代码可读性更高。
如果 receiver 是一个本来就是值类型的小 array 或 struct,没有可变字段,没有指针,或只是一个简单的基础类型,如 int 或 string,使用值类型的 receiver 更合适。
值类型的 receiver 可以减少可以生成的垃圾量,如果将值传递给值方法,可以使用栈上的副本而不是在堆上进行分配。编译器会尝试避免这种分配,但不会总成功。不要为此原因却不事先分析而选择值类型的 receiver。
最后,如有疑问,请使用指针类型的 receiver。

下面看两个比较容易搞混的例子:

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值