循環依存関係を作成せずに Go にパッケージを登録する
問題
他のいくつかのパッケージが依存するインターフェイスを提供する中央パッケージを考えてみましょう。各依存パッケージは、これらのインターフェイスの複数の実装を提供します。目的は、クライアントのインスタンス化を可能にするためにこれらの実装について中央パッケージに通知することですが、中央パッケージに依存パッケージをインポートすると循環依存関係が作成されます。
解決策
Go 標準ライブラリは、次の 2 つのアプローチを提供します。この問題に対処します:
1. 「中央」レジストリを使用しない
- 中央パッケージでインターフェイスを定義し、実装を個別のパッケージにカプセル化します。
- パッケージ名を指定して、必要な実装を明示的にインスタンス化します。
- 例: crypto パッケージは Hash インターフェイスを定義しますが、具体的な実装は次のような別のパッケージにあります。 crypto/md5 および crypto/sha256。
2. 「中央」レジストリを使用すると、
- 実装は通常、パッケージ init() 関数を介して中央パッケージに登録されます。
- 例: イメージ パッケージは、イメージ インターフェイスと複数のイメージ フォーマットを定義します。 image/gif や image/jpeg などのパッケージでの実装。
代替ソリューション (提案): 「カスタム」レジストリ
- 中央パッケージ (pi) と実装パッケージ (pa、pb など) の両方をインポートする中間パッケージ (pf など) を作成します。
- 定義pf の「factory」メソッドでクライアントをインスタンス化し、pf と他の pf 間の循環依存関係を回避します。
推奨事項
最適なソリューションは要件によって異なります。実装を事前に選択できる場合は、オプション 1 が推奨されます。オプション 2 では拡張性が可能ですが、明示的な登録が必要です。オプション 3 は、利便性と拡張性の間の妥協点を提供します。
以上が循環依存関係を作成せずに Go パッケージを登録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。