首頁 > 後端開發 > Golang > 為什麼我無法對 Go 函數呼叫的結果呼叫指標方法?

為什麼我無法對 Go 函數呼叫的結果呼叫指標方法?

Patricia Arquette
發布: 2024-12-19 10:08:15
原創
998 人瀏覽過

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

理解「無法取得位址」與「無法呼叫指標方法」錯誤

使用 Go時,可能會遇到錯誤例如“無法取得位址”或“無法呼叫指標方法”,使學習者感到困惑

問題:

考慮以下Go 程式碼:

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }
登入後複製

第二行會導致編譯錯誤,因為Vector3.Normalize()需要一個指標接收器,這表示它需要一個指向Vector3 值(*Vector3) 而不是Vector3 的指標接收器,這表示它需要一個指向Vector3 值(*Vector3) 而不是Vector3 的指針value.

為什麼會發生:

函數和方法呼叫的回傳值在Go 中是不可尋址的。因此,在第二個範例中,編譯器無法取得 Vector3.Minus() 結果的位址,從而阻止它對該值呼叫 Normalize()。

可能的解決方案:

  • 單獨賦值:將傳回值賦給變數並呼叫該變數的方法變數,如第一個範例所示,其中dir = diff.Normalize() 有效。
  • 更改接收器類型: 修改 Normalize() 方法以具有值接收器(Vector3 而不是 *向量3)。這允許對非指標值進行連結方法呼叫。
  • 回傳指標:使 Normalize() 傳回一個指標 (*Vector3) 以避免定址回傳值的需要。
  • 建立輔助函數:建立一個函數傳回一個值的位址,如pv(v)回傳&v,並對其結果呼叫 Normalize()。

以上是為什麼我無法對 Go 函數呼叫的結果呼叫指標方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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