ホームページ > バックエンド開発 > Golang > Go でメソッドを呼び出すときに、インターフェイス値へのポインターの使用を避けるべきなのはなぜですか?

Go でメソッドを呼び出すときに、インターフェイス値へのポインターの使用を避けるべきなのはなぜですか?

DDD
リリース: 2024-12-07 05:15:16
オリジナル
438 人が閲覧しました

Why Should I Avoid Using Pointers to Interface Values When Calling Methods in Go?

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 のいくつかの重要な概念を理解することが重要です:

  • インターフェイスへのポインター: Go ではインターフェイス値へのポインターを使用することはありません。インターフェイスは抽象化された値型です。
  • 値による呼び出し: 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート