Go 方法集:呼叫指標類型和接收器的方法
Go 方法集的一個經常討論的方面在嘗試呼叫時出現類型為T 的變數上具有接收器型別T 的方法。 Go 規範規定,方法集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() }
編譯器推理
編譯器推斷user.SayWat() 呼叫了接收者類型為*T 的方法,儘管變數 user 的類型為 T。這種行為是由編譯器自動插入 & 引起的,位址運算子。本質上,它重寫了對(&user).SayWat().
調用指針類型的方法
重要的是要澄清,雖然看起來指針類型的方法是在類型T 的變數上呼叫的,但這並不嚴格正確。編譯器使用 *T 類型的接收器,&user 對 T 的解引用是隱式操作。
隱式解引用的例外
但是,這個隱式取消引用並不適用於所有情況。在傳回值(不可定址)上呼叫帶有指標接收器的方法將導致編譯時錯誤,例如:
func aUser() User { return User{} } ... aUser().SayWat()
錯誤訊息
cannot call pointer method on aUser() cannot take the address of aUser()
以上是為什麼 Go 在呼叫指標接收器方法時會隱式取消引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!