ホームページ >バックエンド開発 >Golang >リフレクションを使用して Go で「実際の」インターフェイス実装を検出するにはどうすればよいですか?

リフレクションを使用して Go で「実際の」インターフェイス実装を検出するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-23 22:29:19448ブラウズ

How Can I Detect a

構造体に埋め込まれたインターフェイスを使用したリフレクションの実行: 「実際の」関数の特定

次のコード スニペットを考えてみましょう:

type A interface {
  Foo() string
}

type B struct {
  A
  bar string
}

Go の慣用的なアプローチによれば、上記のパターンは、B が次のようにしなければならないことを示唆しています。 Aインターフェイスを実装します。ただし、OOP 言語とは異なり、これに対するコンパイル時のチェックはありません。代わりに、インターフェイスの一部のみを実装することを選択できます。

リフレクションを使用すると、レシーバー B にメソッドが存在しない場合でも、B の型から直接 A のメソッドを取得できます。ただし、これによって疑問が生じます。パニックを引き起こす前に、「実際の」実装が存在するかどうかをどのように検出できるでしょうか?

これを解決するには、リフレクションのみに依存することはできません。代わりに、単純なアプローチを使用することを検討してください。

method_in_table := B.Foo

// Check if the method is nil
if method_in_table == nil {
  fmt.Println("No real implementation found")
} else {
  // Method is present
}

または、次のリフレクション ベースのチェックを使用することもできます。

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")
if !has || bMeth.Func.ptr.IsZero() {
  // No real implementation found
} else {
  // Method is present
}

このシナリオでは、bMeth の ptr フィールドがfunction is zero を使用すると、関数が匿名インターフェイス値の関数テーブルにあるかどうかを判断できます。 0 の場合、B 構造体には対応するメソッドがなく、実際の実装が欠如していることを示します。

以上がリフレクションを使用して Go で「実際の」インターフェイス実装を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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