Receiver

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,其中指针元素所指的内容可能在方法内被修改
  • 建议使用 value 类型
    • 比较的 struct/array
  • 必须使用 value 类型(编程规范
    • map、函数或者 chan 类型
    • slice,并且方法不会进行 reslice 或者重新分配 slice

value vs pointer #

参考:


本文访问量

本站总访问量

本站总访客数