亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過值或指針訪問另一個結構

通過值或指針訪問另一個結構

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 關注
  • 283 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號