非指標值的指標方法呼叫
在Go 中,可以對非指標值呼叫指標方法,儘管一般規則是指標方法只能在指標上呼叫。這種看似矛盾的行為可以用自動指標取消引用的概念來解釋。
在給定的程式碼片段中:
package main import "fmt" type car struct { wheels int } func (c *car) fourWheels() { c.wheels = 4 } func main() { var c = car{} fmt.Println("Wheels:", c.wheels) c.fourWheels() fmt.Println("Wheels:", c.wheels) }
表達式 c.fourWheels() 是 (&c) 的簡寫.fourWheels()。這是因為 fourWheels 的接收者是指針,而 c 是非指針值。由於 c 是可尋址的,編譯器會自動取消引用它以取得指向 car 值的指針,然後將其用作接收者。
Go 規範中明確說明了此行為:
如果 x 是可尋址的並且 &x 的方法集包含 m,則 x.m()是(&x).m().
因此,雖然有關指標方法的一般規則仍然有效,但自動指標取消參考允許在某些情況下方便地對非指標值呼叫指標方法。需要注意的是,此行為僅適用於具有指標接收器的方法。
以上是為什麼 Go 中可以呼叫非指標值的指標方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!