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

通过值或指针访问另一个结构有什么区别?

什么时候应该使用它们中的每一个?


type foo_ struct {

    st uint8

    nd uint8

}


type bar struct {

    rd  uint8

    foo foo_

}


type barP struct {

    rd  uint8

    foo *foo_

}


扬帆大鱼
浏览 247回答 3
3回答

至尊宝的传说

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

牛魔王的故事

答案很大程度上与语言无关-C语言中的等效内容存在相同的问题。当您具有内含价值时(如所示bar),则您的结构足够大,可以容纳完整的子结构和另一部分。当您有一个指向值的指针时(如barP),那么许多类型的结构barP可能共享相同的foo。当其中任何一个barP修改foo指向它的一部分时,它将影响barP指向同一位置的所有其他结构。另外,正如注释所建议的那样,您必须管理两个单独的对象-thebarP和fooas与普通bar类型的对象相对。在某些语言中,您将不得不担心悬空的指针和未初始化的值等。Go是垃圾收集的,并且通常比其他语言更类型安全。因此,当您希望多个barP对象共享同一foo对象时,请使用指针。否则,请使用显式成员对象,而不是指向对象的指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go