ホームページ > バックエンド開発 > Golang > 循環依存関係を作成せずに Go パッケージを登録するにはどうすればよいですか?

循環依存関係を作成せずに Go パッケージを登録するにはどうすればよいですか?

DDD
リリース: 2024-12-21 06:52:10
オリジナル
865 人が閲覧しました

How to Register Go Packages Without Creating Cyclic Dependencies?

循環依存関係を持たずに Go にパッケージを登録する

問題:

インターフェイスを提供し、依存する中央パッケージがあります。これらのインターフェイスの実装を提供する他のパッケージ。ただし、これらの依存パッケージを中央パッケージに含めると、Go では許可されない循環依存関係が作成されます。

標準ライブラリ ソリューション:

  • なし中央レジストリ: インターフェイスを 1 つのパッケージで定義し、具体的な実装を別のパッケージで定義します。ユーザーは、使用する実装を明示的に指定します。
  • 中央レジストリの場合: 実装は、中央レジストリに自身を登録します (多くの場合、パッケージ init() 関数を介して)。これにより拡張性が得られますが、手動登録が必要です。

カスタム レジストリ ソリューション:

  • 「ファクトリー」メソッドを提供する追加パッケージ (pf) を作成します。特定の実装をインスタンス化します。
  • ファクトリ パッケージは、インターフェイス パッケージ (pi) と実装の両方に依存します。

最適なソリューションの選択:

理想的なアプローチは特定の要件によって異なります:

  • 使用する実装を事前に決定できる場合は、最初のソリューション (中央レジストリを使用しない)。
  • 拡張性が重要で実装を予測できない場合は、2 番目または 3 番目のソリューション (中央レジストリまたはカスタム レジストリを使用する) を検討してください。

カスタム レジストリ ソリューションのコード例:

// Package pi defines an interface I.
package pi

type I interface {
    // Some method.
    DoSomething()
}

// Package pa implements I with type A.
package pa

import "pi"

type A struct{}

func (a *A) DoSomething() {
    // Some implementation.
}

// Package pb implements I with type B.
package pb

import "pi"

type B struct{}

func (b *B) DoSomething() {
    // Some implementation.
}

// Package pf provides a factory to create instances of I.
package pf

import (
    "pi"
    "pa"
    "pb"
)

// NewClient returns an instance of I based on a flag.
func NewClient(flag string) pi.I {
    switch flag {
    case "a":
        return &pa.A{}
    case "b":
        return &pb.B{}
    default:
        panic("Invalid flag")
    }
}
ログイン後にコピー

以上が循環依存関係を作成せずに Go パッケージを登録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート