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 關注
- 283 瀏覽
添加回答
舉報