Golang でのインターフェイス ポインターのメソッドの呼び出し
データベース アクセスのために Gorp ライブラリを使用する場合、開発者は、多くの場合、インターフェイス ポインターのメソッドを呼び出す必要に遭遇します。トランザクションをロールバックする機能を維持しながら、インターフェイス ポインターを使用します。この問題は、Gorp DbMap または Transaction インスタンスをフィールド プロパティとして渡す必要があることから発生します。
問題
コード例で示されているように、メソッドを呼び出そうとしています。 SqlExecutor インターフェイスでポインター参照を使用すると、未定義のメソッド エラーが発生します。これは、*gorp.SqlExecutor 型には Get メソッドがないのに対し、gorp.SqlExecutor インターフェイス自体には Get メソッドがないために発生します。
解決策
根本的な誤解は次のとおりです。インターフェイス値へのポインターを渡すと、他の言語の参照による呼び出しと同じ動作が提供されるという前提です。 Go では、インターフェイスへのポインタは 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 サイトの他の関連記事を参照してください。