3 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
該Golang FAQ現(xiàn)在總結(jié)的區(qū)別:
func (s *MyStruct) pointerMethod() { } // method on pointer func (s MyStruct) valueMethod() { } // method on value
首先,也是最重要的一點(diǎn),該方法是否需要修改接收器?
如果是這樣,則接收者必須是一個(gè)指針。(切片和地圖是引用類型,因此它們的故事有些微妙,但是例如,要在方法中更改切片的長(zhǎng)度,接收方仍必須是指針。)
在上面的示例中,如果pointerMethod
修改的字段s
,調(diào)用方將看到這些更改,但是valueMethod
會(huì)調(diào)用方參數(shù)的副本(即傳遞值的定義)進(jìn)行調(diào)用,因此,所做的更改對(duì)于調(diào)用方將是不可見(jiàn)的。
順便說(shuō)一下,指針接收器與Java中的情況相同,盡管在Java中指針隱藏在幕后。Go的價(jià)值接收者非同尋常。其次是對(duì)效率的考慮。如果接收器很大,例如一個(gè)大的結(jié)構(gòu),那么使用指針接收器會(huì)便宜得多。
(此效率點(diǎn)在“內(nèi)存,內(nèi)存中的變量和指針”中也有說(shuō)明)
其次是一致性。如果類型的某些方法必須具有指針接收器,則其余的方法也應(yīng)具有指針接收器,因此無(wú)論如何使用該類型,方法集都是一致的。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)方法集部分。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
答案很大程度上與語(yǔ)言無(wú)關(guān)-C語(yǔ)言中的等效內(nèi)容存在相同的問(wèn)題。
當(dāng)您具有內(nèi)含價(jià)值時(shí)(如所示bar
),則您的結(jié)構(gòu)足夠大,可以容納完整的子結(jié)構(gòu)和另一部分。
當(dāng)您有一個(gè)指向值的指針時(shí)(如barP
),那么許多類型的結(jié)構(gòu)barP
可能共享相同的foo
。當(dāng)其中任何一個(gè)barP
修改foo
指向它的一部分時(shí),它將影響barP
指向同一位置的所有其他結(jié)構(gòu)。另外,正如注釋所建議的那樣,您必須管理兩個(gè)單獨(dú)的對(duì)象-thebarP
和foo
as與普通bar
類型的對(duì)象相對(duì)。
在某些語(yǔ)言中,您將不得不擔(dān)心懸空的指針和未初始化的值等。Go是垃圾收集的,并且通常比其他語(yǔ)言更類型安全。
因此,當(dāng)您希望多個(gè)barP
對(duì)象共享同一foo
對(duì)象時(shí),請(qǐng)使用指針。否則,請(qǐng)使用顯式成員對(duì)象,而不是指向?qū)ο蟮闹羔槨?/p>
- 3 回答
- 0 關(guān)注
- 284 瀏覽
添加回答
舉報(bào)