Go 接收器方法呼叫語法:深入探究
在《Effective Go》指南中,指出指標方法只能是在指標上調用,而值方法可以在指針或值上調用。然而,最近的一次遇到提出了一個問題:為什麼下面程式碼中的值會呼叫指標方法?
<code class="go">package main import ( "fmt" ) type age int func (a age) String() string { return fmt.Sprintf("%d yeasr(s) old", int(a)) } func (a *age) Set(newAge int) { if newAge >= 0 { *a = age(newAge) } } func main() { var vAge age = 5 pAge := new(age) vAge.Set(10) // Compilation successful }</code>
為了解決這個問題,我們轉向 Go 語言規範。在「呼叫」下,它表示:
如果 x(的類型)的方法集包含 m 並且參數列表可以分配給 m 的參數列表,則方法呼叫 x.m() 是有效的。如果 x 是可尋址的且 &x 的方法集包含 m,則 x.m() 是 (&x).m() 的簡寫。
在我們的例子中,vAge 是可尋址的(到 *age 的型別轉換是有效的),所以vAge.Set(10) 本質上是 (&vAge).Set(10)。由於Set()的接收者類型是指針,這就是為什麼值vAge可以呼叫指標方法Set()。
以上是## Go中為什麼值可以呼叫指標方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!