ホームページ >バックエンド開発 >Golang >Go でインターフェイス ポインターのメソッドを呼び出すと「未定義メソッド」エラーが発生するのはなぜですか?

Go でインターフェイス ポインターのメソッドを呼び出すと「未定義メソッド」エラーが発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-14 14:33:15686ブラウズ

Why Do I Get an

Golang でのインターフェイス ポインターのメソッドの呼び出し

データベース アクセスのために Gorp ライブラリを使用する場合、開発者は、多くの場合、インターフェイス ポインターのメソッドを呼び出す必要に遭遇します。トランザクションをロールバックする機能を維持しながら、インターフェイス ポインターを使用します。この問題は、Gorp DbMap または Transaction インスタンスをフィールド プロパティとして渡す必要があることから発生します。

問題

コード例で示されているように、メソッドを呼び出そうとしています。 SqlExecutor インターフェイスでポインター参照を使用すると、未定義のメソッド エラーが発生します。これは、*gorp.SqlExecutor 型には Get メソッドがないのに対し、gorp.SqlExecutor インターフェイス自体には Get メソッドがないために発生します。

解決策

根本的な誤解は次のとおりです。インターフェイス値へのポインターを渡すと、他の言語の参照による呼び出しと同じ動作が提供されるという前提です。 Go では、インターフェイスへのポインタは 2 つの特定の理由で使用されます。

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。