構造体に埋め込まれたインターフェイスを使用したリフレクションの実行: 「実際の」関数の検出
埋め込みインターフェイスを構造体に組み込む場合 (例: タイプ B) struct { A; bar string })、Go は慣用的に、B がインターフェイス A を実装する必要があることを示唆しています。インターフェイス メソッドを B の型から直接取得するため、混乱が生じる可能性があります。
これに対処するには、次のシナリオを検討してください。
type A interface { Foo() string } type B struct { A bar string }
B のインスタンスがあり、その Foo を取得したいとします。リフレクションを使用したメソッド:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo")
has が true の場合、「実際の」実装があるかどうかをどのように検出できるかという疑問が生じます。
提供された答えは、単純なアプローチを提案しています:
method_in_table := B.Foo fmt.Printf("%T \n", method_in_table)
これは関数の型を出力します:
func(main.B) string
b.A が nil の場合デフォルトでは、埋め込みインターフェイスには Foo の「実際の」実装はありません。これは、
if b.A != nil { b.Foo() }
を使用して確認できます。さらに、リフレクション API 自体は、nil インターフェイス値を検出するメカニズムを提供します:
if bMeth.Ptr.IsNil() { // there is no "real" implementation of Foo }
以上が私の埋め込みインターフェースメソッドは「本物」ですか? Go Reflectionによる実装されたメソッドの検出の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。