3 回答
TA贡献1789条经验 获得超10个赞
该Golang FAQ现在总结的区别:
func (s *MyStruct) pointerMethod() { } // method on pointer func (s MyStruct) valueMethod() { } // method on value
首先,也是最重要的一点,该方法是否需要修改接收器?
如果是这样,则接收者必须是一个指针。(切片和地图是引用类型,因此它们的故事有些微妙,但是例如,要在方法中更改切片的长度,接收方仍必须是指针。)
在上面的示例中,如果pointerMethod
修改的字段s
,调用方将看到这些更改,但是valueMethod
会调用方参数的副本(即传递值的定义)进行调用,因此,所做的更改对于调用方将是不可见的。
顺便说一下,指针接收器与Java中的情况相同,尽管在Java中指针隐藏在幕后。Go的价值接收者非同寻常。其次是对效率的考虑。如果接收器很大,例如一个大的结构,那么使用指针接收器会便宜得多。
(此效率点在“内存,内存中的变量和指针”中也有说明)
其次是一致性。如果类型的某些方法必须具有指针接收器,则其余的方法也应具有指针接收器,因此无论如何使用该类型,方法集都是一致的。有关详细信息,请参见方法集部分。
TA贡献1830条经验 获得超3个赞
答案很大程度上与语言无关-C语言中的等效内容存在相同的问题。
当您具有内含价值时(如所示bar
),则您的结构足够大,可以容纳完整的子结构和另一部分。
当您有一个指向值的指针时(如barP
),那么许多类型的结构barP
可能共享相同的foo
。当其中任何一个barP
修改foo
指向它的一部分时,它将影响barP
指向同一位置的所有其他结构。另外,正如注释所建议的那样,您必须管理两个单独的对象-thebarP
和foo
as与普通bar
类型的对象相对。
在某些语言中,您将不得不担心悬空的指针和未初始化的值等。Go是垃圾收集的,并且通常比其他语言更类型安全。
因此,当您希望多个barP
对象共享同一foo
对象时,请使用指针。否则,请使用显式成员对象,而不是指向对象的指针。
- 3 回答
- 0 关注
- 246 浏览
添加回答
举报