ホームページ >バックエンド開発 >Golang >私の埋め込みインターフェースメソッドは「本物」ですか? Go Reflectionによる実装されたメソッドの検出

私の埋め込みインターフェースメソッドは「本物」ですか? Go Reflectionによる実装されたメソッドの検出

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 15:32:13883ブラウズ

Is My Embedded Interface Method

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

埋め込みインターフェイスを構造体に組み込む場合 (例: タイプ 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 サイトの他の関連記事を参照してください。

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