Go でのインターフェイス ポインターのメソッドの呼び出し
Go では、インターフェイスに対してプログラムを作成し、インターフェイスを変更せずにトランザクションを使用する必要がある場合があります。コード。一般的なアプローチは、「オブジェクト」へのポインターをフィールド プロパティに渡し、必要に応じてロールバックを有効にすることです。ただし、このアプローチは混乱を招く可能性があります。
コード例を考えてみましょう。
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp *gorp.SqlExecutor // Pointer to SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) // Call method on pointer if err != nil { panic(err) } return obj }
ここでは、ロールバックを実行するには Gorp "オブジェクト" へのポインターが必要だと思うかもしれません。ただし、Go のいくつかの重要な概念を理解することが重要です:
このコード例では、Gorp SqlExecutor へのポインターがあっても、インターフェイス ポインター自体のメソッドを呼び出すことはできません。代わりに、基になる値に対してメソッドを呼び出します。この場合、基になる値は SqlExecutor 構造体です。
したがって、リポジトリ構造体からポインタを安全に削除し、単純に SqlExecutor インターフェイスをリポジトリに渡すことができます。
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor // Pointer removed } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
これコードは期待どおりに動作し、基になる SqlExecutor を変更せずにトランザクションを使用できるようになります。このコンテキストでは、インターフェイスへのポインタの受け渡しについて心配する必要はありません。
以上がGo でメソッドを呼び出すときに、インターフェイス値へのポインターの使用を避けるべきなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。