Go 指針:仔細觀察值和指針接收器
在Go 中,指針在有效管理內存和創建可重用性方面發揮著至關重要的作用資料結構。初學者經常糾結於指針的概念,特別是因為它與 C/C 等語言不同。本文旨在澄清 Go 指針的細微差別並解決常見的誤解。
考慮下面的程式碼片段,借自 Go Tour #52:
在這裡,我們定義了一個結構體Vertex,以及計算頂點絕對值的方法 Abs。 Abs 的接收者 v 是指向 Vertex 的指標。這意味著 Abs 對指向頂點的指標進行操作,允許對原始頂點進行修改。
現在,讓我們考慮對程式碼進行輕微修改:
有趣的是,此修改導致相同的結果。我們的問題出現了:使用 *Vertex 或 Vertex 作為 Abs 的接收器之間有區別嗎?
答案在於Go 的兩個基本規則:
值和指標接收器轉換:Go 允許從具有值接收器的方法派生出具有指標接收器的方法。因此, func (v Vertex) Abs() float64 自動產生一個額外的實作:
編譯器無縫地找到產生的方法,解釋了為什麼即使v 不是指針,v.Abs()仍然有效.
自動取位址:Go 可以自動取變數的位址。這意味著當在沒有指標接收器的修改程式碼中呼叫v.Abs() 時,它相當於:
因此,無論我們是否明確使用&,該函數仍然接收指向頂點的指針.
以上是Go 指標:值與指標接收器 - 這很重要嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!