異なるパッケージが相互に依存関係がある場合、循環依存関係なしで Go にパッケージを登録するのは困難になる可能性があります。この問題は、中央パッケージがインターフェイスを提供し、依存パッケージがそれらのインターフェイスの実装を提供する場合に発生します。
1.中央レジストリを使用しない場合:
このアプローチでは、具体的な実装は個別のパッケージで定義され、中央のパッケージは単にインターフェイスを宣言します。特定の実装が必要な場合は、md5.New() や sha256.New() など、明示的にインスタンス化されます。このソリューションは分離を促進し、循環依存関係を排除します。
2.中央レジストリを使用する場合:
この方法には、実装が中央パッケージに自身を登録する登録メカニズムの作成が含まれます。中央パッケージは、適切な実装を選択して作成するための検索機能を提供できます。 Go のイメージ パッケージはこのアプローチを利用し、イメージ形式の登録に基づいてイメージ デコーダーを動的に読み込みます。
3.カスタム レジストリ:
3 番目のオプションは、インターフェイスと実装の間の仲介者として機能するカスタム レジストリを別のパッケージに作成することです。このアプローチにより、パッケージの分離を維持しながら、中央の「ファクトリー」メソッドでインスタンスを作成できるようになります。たとえば、インターフェイスはパッケージ pi に存在し、実装はパッケージ pa および pb に存在し、レジストリ パッケージ pf は pf.NewClient() ファクトリ メソッドを提供します。
最終的に、アプローチの選択は特定のプロジェクトの要件。実装の選択が既知または静的な場合、カスタム レジストリを使用する必要はありません。ただし、動的な拡張と拡張性のために、レジストリ メカニズムにより柔軟性と編成が提供されます。
以上が循環依存関係を作成せずに Go パッケージを登録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。