非指標型別的指標方法
對上一個問題的答案指出指標方法只能在指標上呼叫。然而,這似乎是不正確的,如以下成功呼叫非指標值上的指標方法的程式碼所示:
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) }
解釋
The理解這種行為的關鍵在於方法接收者是一個指標。當您呼叫 c.fourWheels() 時,接收者值 c 是一個非指標。但是,由於接收者類型是指針,因此這被解釋為 (&c).fourWheels() 的簡寫。
根據 Go 規範,在呼叫方法時,如果接收者值是可尋址的且接收者類型是指針,則方法呼叫被解釋為指針方法呼叫。在我們的例子中,接收器值 c 是可尋址的,且接收器類型 *car 是一個指針,因此方法呼叫 c.fourWheels() 實際上是呼叫 (&c).fourWheels()。
此行為是與可以在指標和值上呼叫值方法,而只能在指標上呼叫指標方法的說法一致。對於指標方法,如果接收者值不是指針,則必須取消引用以獲得可用作接收者的指標值。
以上是Go 中的非指標值可以呼叫指標方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!