ホームページ >バックエンド開発 >Golang >実行時に Go インターフェイスを実装するインスタンスを動的に検出するにはどうすればよいですか?

実行時に Go インターフェイスを実装するインスタンスを動的に検出するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 05:51:31419ブラウズ

 How to Dynamically Discover Instances Implementing a Go Interface at Runtime?

Golang: インターフェイスを実装したインスタンスの検出

Golang では、多くの場合、特定のタイプのインスタンスまたは実装されているインスタンスに対して操作を実行することが望ましいです。特定のインターフェイス。ただし、言語の厳密な型指定により、実行時に特定の基準を満たすすべてのインスタンスを識別するという課題が生じます。

問題の概要

次の使用例を考えてみましょう:

  • インターフェイス I は、start() と stop() という 2 つのメソッドを定義します。
  • 複数の構造体 (A、B、および C) はインターフェイス I を実装します。
  • プログラムの起動中に、 start() は、A、B、C のすべてのインスタンスで呼び出す必要があります。
  • 同様に、プログラムの終了中に、stop() をこれらのインスタンスで呼び出す必要があります。
  • 動的検出を容易にするために、コード内で構造体名をハードコーディングしないことをお勧めします。

解決策の議論

Golang の型システムでは、実行時にすべての構造体名を取得することはできません。インターフェイスを実装する型。これは、Go が静的に型付けされており、コンパイラーが未使用の型とメソッドを削除して結果のバイナリを最適化するためです。

代替アプローチ

代替ソリューションは、グローバルを維持することです。インターフェースを実装するインスタンスに識別子を関連付けるマップまたはスライス。各構造体は、このグローバル コレクションにインスタンスを追加することで自身を初期化できます。

例:

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

type A struct {}

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

起動時と終了時に、プログラムはグローバル コレクションを反復処理して、適切なメソッドを呼び出すことができます。

複数インスタンスの拡張

各タイプの複数のインスタンスが存在できる場合、新しいインスタンスが作成されたり削除されたりするたびに、グローバル コレクションを更新する必要があります。もう使われていません。これにより、ガベージ コレクターによる適切な処理が保証されます。

以上が実行時に Go インターフェイスを実装するインスタンスを動的に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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