>백엔드 개발 >Golang >순환 종속성을 만들지 않고 Go 패키지를 등록하는 방법은 무엇입니까?

순환 종속성을 만들지 않고 Go 패키지를 등록하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-21 06:52:10791검색

How to Register Go Packages Without Creating Cyclic Dependencies?

순환 종속성 없이 Go에 패키지 등록

문제:

인터페이스를 제공하고 다음에 의존하는 중앙 패키지가 있습니다. 해당 인터페이스의 구현을 제공하는 다른 패키지. 그러나 중앙 패키지에 이러한 종속 패키지를 포함하면 Go에서 허용하지 않는 순환 종속성이 생성됩니다.

표준 라이브러리 솔루션:

  • 없음 중앙 레지스트리: 하나의 패키지에 인터페이스를 정의하고 별도의 패키지에 구체적인 구현을 정의합니다. 사용자는 사용할 구현을 명시적으로 지정합니다.
  • 중앙 레지스트리 사용: 구현은 중앙 레지스트리에 자신을 등록합니다(종종 패키지 init() 함수를 통해). 이는 확장성을 허용하지만 수동 등록이 필요합니다.

사용자 정의 레지스트리 솔루션:

  • "팩토리" 메소드를 제공하는 추가 패키지(pf)를 생성합니다. 특정 구현을 인스턴스화합니다.
  • 팩토리 패키지는 인터페이스 패키지(pi)와 구현 패키지(pa, pb 등), 그러나 pf는 자체 의존적이지 않기 때문에 순환을 생성하지 않습니다.

최상의 솔루션 선택:

이상적인 접근 방식 특정 요구 사항에 따라 다릅니다.

  • 사용할 구현을 미리 결정할 수 있는 경우 첫 번째 솔루션을 선택하세요(
  • 확장성이 중요하고 구현을 예측할 수 없는 경우 두 번째 또는 세 번째 솔루션(중앙 또는 사용자 정의 레지스트리 사용)을 고려하십시오.

코드 예 사용자 정의 레지스트리 솔루션:

// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.