」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 可以在類型為“*T”的變數上呼叫接收器類型為“T”的 Go 方法嗎?

可以在類型為“*T”的變數上呼叫接收器類型為“T”的 Go 方法嗎?

發佈於2024-12-22
瀏覽:153

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

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

問題:

Go規範規定,指標型別T的方法集包含其對應型別T的方法集。這是否意味著我們可以在 T 類型的變數上呼叫接收者 T 的方法?

答案:

雖然規範建議這樣做,但重要的是要注意,您不能直接在 T 上調用 *T 的方法。相反,編譯器會自動將變數解引用到&T 並呼叫該方法,從而有效執行(&T).m().

此行為Go 規範中明確定義:

「調用:如果x(的類型)的方法集包含m 且參數列表可以指派給x 的參數列表,則該方法呼叫x.m() 有效。 m。
以下範例說明了此行為:

package main 進口 ( “FMMT” “反映” ) 類型使用者結構{} func(這個*用戶)SayWat(){ fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } 函數主() { var 使用者 = 使用者{} fmt.Println(reflect.TypeOf(用戶)) user.SayWat() }

儘管使用 *User 接收者聲明了 SayWat 方法,但我們可以在 User 類型上呼叫它。編譯器會自動處理取消引用並呼叫 (&user).SayWat().

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

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

func main() {
    var user = User{}

    fmt.Println(reflect.TypeOf(user))

    user.SayWat()
}

但是,這僅適用於可尋址變數。如果嘗試對不可尋址的值呼叫指標方法,將會遇到錯誤。例如:

func aUser() User { 返回使用者{} } …… aUser().SayWat() // 錯誤:無法在 aUser() 上呼叫指標方法

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3