接下来是一致性 . 如果该类型的某些方法必须具有指针接收器,则其余方法也应如此,因此无论使用何种类型,方法集都是一致的 . 有关详细信息,请参阅方法集部分 .

如上所述in this thread:

关于接收器的指针与值的规则是可以在指针和值上调用值方法,但只能在指针上调用指针方法

现在:

有人能告诉我一个值接收器明显比指针接收器更有意义的情况吗?

Code Review comment可以提供帮助:

如果接收器是map,func或chan,请不要使用指向它的指针 . 如果接收器是切片并且该方法不重新切片或重新分配切片,则不要使用指向它的指针 . 如果该方法需要改变接收器,则接收器必须是指针 . 如果接收器是包含sync.Mutex或类似同步字段的结构,则接收器必须是避免复制的指针 . 如果接收器是大型结构或数组,则指针接收器更有效 . 有多大?假设它相当于将所有元素作为参数传递给方法 . 如果感觉太大,对接收器来说也太大了 . 函数或方法可以同时或在从这种方法调用时改变接收器吗?在调用方法时,值类型会创建接收器的副本,因此外部更新将不会应用于此接收器 . 如果必须在原始接收器中看到更改,则接收器必须是指针 . 如果接收器是结构,数组或切片,并且其任何元素是指向可能变异的东西的指针,则更喜欢指针接收器,因为它将使读者更清楚地意图 . 如果接收器是一个小数组或结构,它自然是一个值类型(例如,类似于time.Time类型),没有可变字段和没有指针,或者只是一个简单的基本类型,如int或string, Value 接收者是有道理的值接收器可以减少可以生成的垃圾量;如果将值传递给值方法,则可以使用堆栈上的副本而不是在堆上进行分配 . (编译器试图避免这种分配,但它不能总是成功 . )不要为此而选择值接收器类型而不先进行分析 . 最后,如有疑问,请使用指针接收器 .

例如,在_352713中找到粗体部分:

// Write writes the headers described in h to w.
//
// This method has a value receiver, despite the somewhat large size
// of h, because it prevents an allocation. The escape analysis isn't
// smart enough to realize this function doesn't mutate h.
func (h extraHeader) Write(w *bufio.Writer) {
...
}