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

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

Mary-Kate Olsen
リリース: 2025-01-05 15:32:13
オリジナル
843 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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