Go 中的簡單型別可以呼叫指標型別的方法嗎?
儘管 Go 規範聲明該方法設定為 T 包含 T 的方法,關於是否可以在類型的變數上呼叫具有 T接收器的方法會產生混淆T.
方法呼叫
問題的關鍵在於方法呼叫不限於使用指標接收器類型。編譯器透過自動取消引用值來巧妙地處理方法調用,以獲得所需的接收器類型。實際上,呼叫帶有 *T 接收器的方法相當於呼叫 (&user).m(),其中 &user 檢索變數的位址。
實際示範
考慮以下程式碼範例:
package main import "fmt" 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.SayWat() }
執行此程式碼後,您會注意到該方法即使使用者不是指標類型,也會成功執行。這是因為編譯器會自動取消引用使用者來呼叫 SayWat 方法。
解決歧義
處理方法返回時會出現明確的區別。如果方法傳回一個值,它將建立一個不可尋址的結果,無法使用點語法直接呼叫該結果。相反,明確使用“&”語法來取得傳回值的位址。
以上是可以在非指標變數上呼叫帶有指標接收器的 Go 方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!