首頁 > 後端開發 > Golang > 可以在非指標變數上呼叫帶有指標接收器的 Go 方法嗎?

可以在非指標變數上呼叫帶有指標接收器的 Go 方法嗎?

Patricia Arquette
發布: 2024-12-01 16:22:10
原創
621 人瀏覽過

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

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

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