为了账号安全,请及时绑定邮箱和手机立即绑定

通过值或指针访问另一个结构

通过值或指针访问另一个结构

Go
扬帆大鱼 2021-04-08 18:15:04
通过值或指针访问另一个结构有什么区别?什么时候应该使用它们中的每一个?type foo_ struct {    st uint8    nd uint8}type bar struct {    rd  uint8    foo foo_}type barP struct {    rd  uint8    foo *foo_}
查看完整描述

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的价值接收者非同寻常。

其次是对效率的考虑。如果接收器很大,例如一个大的结构,那么使用指针接收器会便宜得多。

(此效率点在“内存,内存中的变量和指针”中也有说明)

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


查看完整回答
反对 回复 2021-04-26
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

答案很大程度上与语言无关-C语言中的等效内容存在相同的问题。

当您具有内含价值时(如所示bar),则您的结构足够大,可以容纳完整的子结构和另一部分。

当您有一个指向值的指针时(如barP),那么许多类型的结构barP可能共享相同的foo。当其中任何一个barP修改foo指向它的一部分时,它将影响barP指向同一位置的所有其他结构。另外,正如注释所建议的那样,您必须管理两个单独的对象-thebarPfooas与普通bar类型的对象相对。

在某些语言中,您将不得不担心悬空的指针和未初始化的值等。Go是垃圾收集的,并且通常比其他语言更类型安全。

因此,当您希望多个barP对象共享同一foo对象时,请使用指针。否则,请使用显式成员对象,而不是指向对象的指针。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信