首頁 > 後端開發 > Golang > 為什麼在 Go 中呼叫介面指標的方法時會出現「未定義方法」錯誤?

為什麼在 Go 中呼叫介面指標的方法時會出現「未定義方法」錯誤?

Susan Sarandon
發布: 2024-12-14 14:33:15
原創
677 人瀏覽過

Why Do I Get an

Golang 中呼叫介面指標的方法

在使用Gorp 函式庫存取資料庫時,開發者常會遇到需要呼叫介面指標方法的情況接口指針,同時保持回滾事務的能力。此問題是由於需要將 Gorp DbMap 或 Transaction 實例作為字段屬性傳遞而引起的。

問題

如範例程式碼所示,嘗試呼叫方法在 SqlExecutor 介面上使用指標引用會導致未定義的方法錯誤。發生這種情況是因為類型 *gorp.SqlExecutor 沒有 Get 方法,而 gorp.SqlExecutor 介面本身有。

解決方案

潛在的誤解在於假設將指標傳遞給介面值提供與其他語言中的引用呼叫相同的行為。在 Go 中,使用介面指標有兩個具體原因:

  1. 傳遞大型結構體值時會最佳化效能。
  2. 允許被呼叫者修改原始值(當方法有一個指標接收器)。

這些原因都不適用於介面指針,因為介面值已經很小,無法通過介面值本身。相反,有必要修改儲存在介面值中的值,該值通常是指向實際結構的指標。

正確實作

要解決此問題,程式碼應避免傳遞指向 Gorp「物件」的指針,而應直接傳遞介面值。以下程式碼正確地實現了這種方法:

package repositories

import "github.com/coopernurse/gorp"

type Repository struct {
    Gorp gorp.SqlExecutor // Pass the interface value directly
}

func (r Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}
登入後複製

透過按值而不是按引用傳遞介面值,程式碼可以維護所需的功能,同時遵守 Go 中指標的正確用法。

以上是為什麼在 Go 中呼叫介面指標的方法時會出現「未定義方法」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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