首頁 > 後端開發 > Golang > Go 的指標接收器方法可以在非指標變數上呼叫嗎?

Go 的指標接收器方法可以在非指標變數上呼叫嗎?

Barbara Streisand
發布: 2024-11-27 21:49:16
原創
957 人瀏覽過

Can Go's Pointer Receiver Methods Be Called on Non-Pointer Variables?

使用接收者T 呼叫指標型別*T 的方法

Go 程式語言規格規定任何型別T 的方法集包含以下內容接收者類型為T 的所有方法。但是,對應指標類型 T 的方法集是接收者為 T 的所有方法的集合或 T (包括 T 的方法集)。

這意味著我們可以在 T 類型的變數上呼叫帶有 *T 類型接收者的方法,因為編譯器隱式取消引用該變數來呼叫該方法。

為了驗證這個概念,請考慮以下程式碼:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (self *User) SayWat() {
    fmt.Println(self)
    fmt.Println(reflect.TypeOf(self))
    fmt.Println("WAT\n")
}

func main() {
    var user User = User{}

    fmt.Println(reflect.TypeOf(user), "\n")

    user.SayWat()
}
登入後複製

當我們執行此程式碼時,我們觀察到可以呼叫SayWat() 方法在使用者變數上,即使該方法是使用指標接收器定義的。這是因為編譯器會自動為我們取消引用該變數。

但是,需要注意的是,我們不能直接在 T 上呼叫 *T 的方法。例如,以下程式碼將失敗並出現編譯器錯誤:

func main() {
    var user User = User{}

    (&user).SayWat()
}
登入後複製

在這種情況下,編譯器無法隱式取消引用該變量,因為 SayWat() 方法是使用指標接收器定義的。要呼叫該方法,我們必須使用 & 運算子明確取消引用該變數。

因此,雖然我們可以在 T 類型的變數上呼叫具有 T 類型接收者的方法,但我們不能呼叫直接T對T。

以上是Go 的指標接收器方法可以在非指標變數上呼叫嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板