DbMap タイプとトランザクション タイプの両方を提供するデータベース アクセス用の Gorp ライブラリを使用する場合、次のような問題が発生する可能性があります。インターフェイス ポインターでメソッドを呼び出す必要があります。これは、トランザクションの使用中にロールバックを実行する必要がある場合に発生する可能性があります。
コード サンプルで発生した問題を解決するには、Go ではインターフェイスへのポインターを渡す必要がないことを理解することが重要です。他の言語とは異なり、Go は参照による呼び出しを使用しません。代わりに、ポインタを渡す必要があるのは、関数内の元の値を変更する必要がある場合のみであり、インターフェイス値の場合は通常そうではありません。
問題は、gorp.SqlExecutor インターフェイスの Get メソッドが取得するためです。最初のパラメータとしてポインタ値。ただし、リポジトリ構造体はこのパラメータに非ポインタ値 (*gorp.SqlExecutor) を割り当てようとしているため、エラー メッセージが表示されます。
この問題を解決する正しい方法は、インターフェイス値へのポインタを使用することです。メソッド呼び出しで直接。修正されたコードは次のとおりです。
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
インターフェイスへのポインターを直接使用することで、Get メソッドがトランザクションのロールバックに必要な元の値を変更できるようになります。
以上がGo でインターフェイス ポインターのメソッドを呼び出すときにエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。