構造体に埋め込まれたインターフェイスを使用したリフレクションの実行: 「実際の」関数の特定
次のコード スニペットを考えてみましょう:
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 サイトの他の関連記事を参照してください。