至尊宝的传说
该Golang FAQ现在总结的区别:func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct) valueMethod() { } // method on value首先,也是最重要的一点,该方法是否需要修改接收器?如果是这样,则接收者必须是一个指针。(切片和地图是引用类型,因此它们的故事有些微妙,但是例如,要在方法中更改切片的长度,接收方仍必须是指针。)在上面的示例中,如果pointerMethod修改的字段s,调用方将看到这些更改,但是valueMethod会调用方参数的副本(即传递值的定义)进行调用,因此,所做的更改对于调用方将是不可见的。顺便说一下,指针接收器与Java中的情况相同,尽管在Java中指针隐藏在幕后。Go的价值接收者非同寻常。其次是对效率的考虑。如果接收器很大,例如一个大的结构,那么使用指针接收器会便宜得多。(此效率点在“内存,内存中的变量和指针”中也有说明)其次是一致性。如果类型的某些方法必须具有指针接收器,则其余的方法也应具有指针接收器,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参见方法集部分。