ホームページ  >  記事  >  バックエンド開発  >  Go でインターフェイスを実装するすべての構造体を動的に見つけることができますか?

Go でインターフェイスを実装するすべての構造体を動的に見つけることができますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 04:31:29872ブラウズ

 Can You Dynamically Find All Structs Implementing an Interface in Go?

Go でインターフェイスを実装する構造体のスキャン

背景:
Go では、次のようなシナリオが発生する可能性があります。ここでは、共通のインターフェイスを実装する複数の構造体に動的にアクセスする必要があります。ただし、Go は静的に型付けされた言語であるため、特定のインターフェイス タイプのすべての構造体をスキャンするための組み込みメカニズムは提供されません。

質問:
start() メソッドと stop() メソッドを備えたインターフェイスの場合、そのインターフェイスを実装するすべての構造体のリストを取得することはできますか?この情報により、実装された構造体のすべてのインスタンスで start() と stop() を動的に呼び出すことができるようになります。

答え:
残念ながら、いいえ、これは直接には不可能です。 Go の静的型付けでは、未使用の型定義が排除され、アプリケーションで明示的に使用されていない構造体にアクセスすることが困難になります。

代替アプローチ:
構造体を動的にスキャンする代わりに、別の解決策は、グローバル マップまたはスライスを作成することです。インターフェイスを実装する各構造体は、アプリケーションの初期化中に init() 関数を使用してこのマップにインスタンスを追加できます。これにより、さまざまな構造体のすべてのインスタンスにアクセスでき、一元的に管理できるようになります。

例:

<code class="go">var instMap = map[string]StartStopper

type A struct {}

func init() {
    instMap["A"] = new(A)
}</code>

このマップを反復処理することで、動的に呼び出すことができます。登録されているすべてのインスタンスの start() メソッド。

複数のインスタンスに関する考慮事項:
各タイプの複数のインスタンスが存在できる場合は、マップにインスタンスを手動で追加する必要があります。作成されるたびに。さらに、インスタンスが不要になった場合は、ガベージ コレクターがインスタンスを無視しないように、マップからインスタンスを削除する必要があります。

以上がGo でインターフェイスを実装するすべての構造体を動的に見つけることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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