使用接收者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中文網其他相關文章!