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

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

Barbara Streisand
풀어 주다: 2024-12-29 14:01:10
원래의
185명이 탐색했습니다.

How to Register Go Package Implementations Without Creating Cyclic Dependencies?

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

Go 애플리케이션을 설계할 때 하나의 패키지가 종속되는 패키지 간의 순환 종속성을 피하는 것이 중요합니다. 다른 하나는 첫 번째에 의존합니다. 이는 여러 패키지에 걸쳐 인터페이스와 해당 구현을 정의할 때 발생할 수 있습니다.

질문:

중앙 패키지( 클라이언트 인터페이스) 및 구현을 포함하는 패키지(예: UDPClient, TCPClient)?

답변:

표준 라이브러리는 이 문제를 해결하기 위해 두 가지 주요 접근 방식을 제공합니다.

1. 중앙 레지스트리 없이

중앙 패키지에서 클라이언트 인터페이스를 정의합니다. 구현을 위해 클라이언트를 인스턴스화할 때 원하는 구현을 명시적으로 지정합니다. 예:

import (
    "hash/md5"
    "hash/sha256"
)

func main() {
    h1 := md5.New()
    h2 := sha256.New()
}
로그인 후 복사

2. 중앙 레지스트리를 사용하여

구현이 스스로 등록되는 레지스트리 메커니즘을 만듭니다. 이 접근 방식은 질문에서 논의된 자발적인 등록과 유사합니다. 다양한 이미지 형식 디코더(예: GIF, JPEG, PNG)가 스스로 등록되는 이미지 패키지에 사용됩니다.

3. 제안된 사용자 정의 레지스트리

클라이언트 생성을 위해 NewClient() 메서드를 제공하는 별도의 팩토리 패키지를 도입합니다. 이 패키지는 순환 종속성을 유발하지 않고 인터페이스 및 구현 패키지를 참조할 수 있습니다. 예를 들면 다음과 같습니다.

package pi

// Client represents the client interface.
type Client interface { ... }
로그인 후 복사
package pa

// UDPClient implements the Client interface.
type UDPClient struct { ... }
로그인 후 복사
package pb

// TCPClient implements the Client interface.
type TCPClient struct { ... }
로그인 후 복사
package pf

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

// NewClient creates a client based on the implementation.
func NewClient(impl string) pi.Client {
    switch impl {
    case "udp":
        return &pa.UDPClient{}
    case "tcp":
        return &pb.TCPClient{}
    default:
        panic("Unsupported implementation")
    }
}
로그인 후 복사

위 내용은 순환 종속성을 만들지 않고 Go 패키지 구현을 등록하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿