2 回答

TA貢獻1921條經驗 獲得超9個贊
從官方常見問題解答中查看此項目:
對于不習慣指針的程序員來說,這兩個例子之間的區別可能會令人困惑,但情況其實很簡單。在類型上定義方法時,接收器(在上面的示例中為 s)的行為就像它是方法的參數一樣。將接收者定義為值還是指針是同一個問題,那么,函數參數應該是值還是指針。有幾個考慮。
首先,也是最重要的,該方法是否需要修改接收器?如果是,則接收者必須是一個指針。(切片和映射充當引用,所以它們的故事有點微妙,但是例如要更改方法中切片的長度,接收者仍然必須是指針。)在上面的示例中,如果 pointerMethod 修改了s,調用者將看到這些更改,但 valueMethod 是使用調用者參數的副本調用的(這是傳遞值的定義),因此調用者將看不到它所做的更改。
順便說一句,指針接收器與 Java 中的情況相同,盡管在 Java 中指針隱藏在幕后;Go 的價值接收者是不尋常的。
二是對效率的考慮。如果接收器很大,例如一個大的結構,使用指針接收器會便宜得多。
接下來是一致性。如果該類型的某些方法必須有指針接收器,其余的也應該如此,因此無論如何使用該類型,方法集都是一致的。有關詳細信息,請參閱方法集部分。
對于諸如基本類型、切片和小型結構之類的類型,值接收器非常便宜,因此除非方法的語義需要指針,否則值接收器是高效且清晰的。

TA貢獻2012條經驗 獲得超12個贊
沒有明確的答案,但它們完全不同。當您不使用指針時,您“按值傳遞”意味著您調用它的對象將是不可變的(修改副本),當您使用指針時,您“按引用傳遞”。我會說你更經常使用指針種類,但它完全取決于情況,沒有“更好的方法”。
如果您查看各種編程框架/類庫,您會看到許多示例,其中作者故意選擇按值或引用來做事。例如,在 C# .NET 中,這是結構和類以及類似Guid
和DateTime
被故意實現為結構(值類型)。同樣,我認為指針通常是更好的選擇(如果你通過 .NET 看幾乎所有東西都是一個類,引用類型),但這絕對取決于你希望通過類型實現什么和/或你想要消費者的方式/other 開發人員與之交互。您可能需要考慮性能和并發性(也許您希望一切都按值計算,這樣您就不必擔心類型的并發操作,也許您需要一個指針,因為對象內存占用量很大,復制它會使您的程序太慢或耗電)。
- 2 回答
- 0 關注
- 185 瀏覽
添加回答
舉報