Receiver #
- value method 可以被 value 和 pointer 对象调用
- 结构体类型实现的接口,该结构体的指针类型也算实现了该接口
- 而 pointer method 只能被 pointer 对象调用
- pointer method 会修改对象的值,而 value method 不会,所以如果在一个 value 对象上调用 pointer method,编译器会对原来的值做一份拷贝,并在拷贝后的值上执行函数,那么如果函数有修改原 receiver 的值,则修改的行为都发生在拷贝的值上,而不会影响原值,这个错误很隐蔽不容易被调试发现,因此 go 决定放弃这个错误发生的可能性,直接不支持 pointer method 被 value 对象调用。
使用规则 #
- 必须使用指针
struct
,且包含sync.Mutex
类型字段
- 建议使用指针
- 比较大的 struct/array
- struct 或者 array 中的元素个数超过 3 个,则认为比较大,反之,则认为比较小
- struct、array 或 slice,其中指针元素所指的内容可能在方法内被修改
- 比较大的 struct/array
- 建议使用 value 类型
- 比较小的 struct/array
- 必须使用 value 类型(编程规范)
- map、函数或者
chan
类型 - slice,并且方法不会进行
reslice
或者重新分配 slice
- map、函数或者
value vs pointer #
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。