非指標類型上的指標方法解釋
在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() // Here, a pointer method is invoked on a non-pointer value fmt.Println("Wheels:", c.wheels) }
程式碼成功執行了指標方法 fourWheels關於非指標值 c.這似乎與既定規則相矛盾。
實際上,當對非指標值 c 呼叫 fourWheels 方法時,您正在使用速記符號。表達式 c.fourWheels() 等價於 (&c).fourWheels()。
Go 規範指出:「如果x 是可尋址的且&x 的方法集包含m,則x.m() 是( 的簡寫&x).m()."
換句話說,Go 隱式解引用非指針值c 以獲得指向它的指針,即然後用作指針方法的接收者。
為了澄清關於指標方法的規則,應該解釋如下:
以上是為什麼 Go 中可以對非指標值呼叫指標方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!