Golang: 特定の実装による構造のスキャン
Go では、共有インターフェイスを使用して複数の構造を操作すると、課題が生じる可能性があります。各構造インスタンスを個別に処理することは可能ですが、特定のインターフェイスに準拠するすべての構造を自動的に検索して操作する必要が生じる場合があります。
問題
シナリオ複数の構造 (A、B、および C) によるインターフェイス I の実装が含まれます。アプリケーションの起動時に、A、B、C の各インスタンスに対して start() メソッドを呼び出す必要があります。同様に、終了時に、これらのインスタンスで stop() メソッドを呼び出す必要があります。ただし、コード内でこれらの特定の構造をハードコーディングすることは避け、I インターフェイスを実装する新しい構造が導入されるときにシームレスに変更できるようにする必要があります。
答え
残念ながら、 Go では、あなたが思い描いているアプローチは実現不可能です。 Go は静的に型付けされた言語であり、リンカーは未使用の型定義とメソッドを削除します。したがって、コード内で明示的に参照されていない型は省略されます。
代替ソリューション
代替アプローチは、次のようなグローバル マップ (またはスライス) を作成することです。 I インターフェイスを実装する各構造体のインスタンス。これらのインスタンスは、初期化中に init 関数を使用して登録できます。
<code class="go">var instMap = map[string]StartStopper type A struct {} func init() { instMap["A"] = new(A) }</code>
起動中にマップを反復処理し、各インスタンスで Start() メソッドを呼び出すことができます。
複数のインスタンスの処理
各構造タイプに複数のインスタンスが存在する可能性がある場合は、登録プロセスを変更して、インスタンスの作成時にマップにインスタンスを追加する必要があります。また、メモリ リークの可能性を防ぐために、使用されなくなったインスタンスを削除する必要があります。
以上がGolang で特定のインターフェイスを実装する構造を動的にスキャンして操作する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。