指標類型的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