Receviver vs Pointer Receviver
June 27, 2021About 2 min
Receviver vs Pointer Receviver
官方指导:
- 如果接收者是
map
,func
,chan
这些类型,不要使用指针类型。 - 如果接收者是切片或者该方法不会重新分配或切片就不用指针类型。
- 如果方法需要改变接收者,接收者必须是一个指针。
- 如果接收者是一个含有
sync.Mutex
或者有同步类型的数据结构,那么接收者必须是一个指针,去避免被复制。 - 如果接收者是一个大的结构体或者数组,就是使用指针。多大算大?大概是把接收者的所有属性都当参数传递到该方法中。这些参数过多过大就算大。
- 当一个方法被调用时,一个值类型的接收者是会被复制传入,所以外部的更新并不会应用到接收者中。如果需要修改源接收者,那么就需要把接收者设置为指针。
- 如果接收者是一个
struct
,array
或者slice
其中所有元素都是指针,这些指针可能会被修改。所以接收者最好是指针。 - 如果接收者是一个小数组或结构,它自然是一个值类型(例如,类似 time.Time 类型的东西),没有可变字段和指针,或者只是一个简单的基本类型,例如 int 或 string, 值类型接收者是有道理的。 一个值接收者可以减少可以产生的垃圾量; 如果将值传递给值方法,则可以使用堆栈上副本而不是在堆上分配。 (编译器试图巧妙地避免这种分配,但它不可能总是成功。)不要在没有首先分析的情况下选择值接收器类型。
- 不要混着用指针和类型传入,在同一个类型中
- 最后,当你不知道用啥的时候,就用指针