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