首頁 > 後端開發 > Golang > 為什麼 Go 在呼叫指標接收器方法時會隱式取消引用?

為什麼 Go 在呼叫指標接收器方法時會隱式取消引用?

DDD
發布: 2024-12-02 07:03:10
原創
803 人瀏覽過

Why Does Go Implicitly Dereference When Calling Pointer Receiver Methods?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板