Go 中值接收器與指標接收器的方法:理解設計與基本原理
在Go 中,可以使用以下任一方式定義方法值接收器(T) 或指標接收器(T)。雖然 T 上定義的方法可以影響 T 的副本,但 T 上定義的方法會影響 T 引用的實際資料。
為什麼值接收器上的方法也可以由指標接收器使用
在T 上定義的方法可以在T 上使用,因為Go 在向函數傳遞參數時會自動取消引用指標。例如,如果您在int:
<code class="go">func (n *int) Add(x int) { *n += x }</code>
上定義了一個方法,則可以在*int 和int:
<code class="go">var n int ptr := &n ptr.Add(5) // Call Add on *int n.Add(5) // Automatically dereferences ptr when calling Add on int</code>
Why 方法上呼叫此方法on 指標接收器不能被值接收器使用
*T 上定義的方法不能在T 上使用,因為Go 在傳遞參數時不會自動引用值給函數。要建立指向值的指針,您需要使用 & 運算子明確取得其位址:
<code class="go">var n int ptr := &n</code>
但是,這可能並不總是可行。例如,如果 T 儲存在映射中或從函數傳回,則其位址可能不是靜態的或可存取的。
設計的優點和缺點
這個設計提供了幾個好處:
但是,它也有一個缺點:
以上是為什麼 Go 中的指標可以使用值接收器方法,但反之則不行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!