首頁 >後端開發 >Golang >為什麼 Go 中可以對非指標值呼叫指標方法?

為什麼 Go 中可以對非指標值呼叫指標方法?

Patricia Arquette
Patricia Arquette原創
2024-12-27 11:49:11771瀏覽

Why Can Pointer Methods Be Called on Non-Pointer Values in Go?

非指標類型上的指標方法解釋

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn