Go最佳实践:如何选择「指针接收器」、「值接收器」
概念定义
- 指针接收器
1 | func (t *Type) Method() {} //pointer receiver 指针接收器 |
- 值接收器
1 | func (t Type) Method() {} //value receiver 值接收器 |
何时使用何者
常在定义struct方法时遇到接收器类型的选择问题
指针接收器
需要改动接收器本身时:若需要在方法里修改接收器的状态或字段值时,使用指针接收器。因为值接收器只是本体的一个副本,对其任何的改动都只是作用在副本上
需要性能的优化:如果struct非常多字段,占用内存大,则使用指针接收器,因为值接收器的副本复制成本太大,导致性能低下。
值接收器
需要并发安全:值接收器因为是副本,因此是并发安全的
无需修改接收器本身时
两者兼存时,如何权衡
你定义的方法可能有指针接收器和值接收器,这时为了统一,选择全部统一改为指针接收器