"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go의 여러 패키지에서 동일한 메서드 서명을 처리하는 방법은 무엇입니까?

Go의 여러 패키지에서 동일한 메서드 서명을 처리하는 방법은 무엇입니까?

2024-11-06에 게시됨
검색:255

How to Handle Identical Method Signatures Across Different Packages in Go?

다양한 패키지에서 동일한 메소드 서명을 사용하여 인터페이스 처리

Go에서는 동일한 메소드 서명을 사용하지만 별도의 패키지에 정의된 여러 인터페이스를 처리할 때 다음과 같은 상황이 발생할 수 있습니다. 두 인터페이스를 모두 구현하는 유형은 예상치 못한 동작으로 이어집니다.

다른 패키지에 정의된 두 인터페이스(Doer)와 함수(FuncA 및 FuncB)를 고려하세요.

// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)

// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)

유형 C가 두 패키지 모두에서 Doer를 구현하고 구현이 다른 경우:

// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }

func main() {
    cA := C(0); A.FuncA(cA)
    cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}

이 문제를 해결하기 위해 Go의 유형 시스템은 이름별 일치와 유형의 일관성을 강조합니다. 객체가 여러 인터페이스를 충족할 수 있도록 허용하지만 공유 메서드의 구현은 적용 가능한 모든 인터페이스 계약을 준수해야 합니다.

위 시나리오에서 해결 방법은 래퍼 유형을 구현하는 것입니다.

// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }

func main() {
    cA := DoerA{C(0)}; A.FuncA(cA)
    cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}

이러한 래퍼를 생성하면 의도한 인터페이스 사용에 따라 Do() 구현을 제어하여 각 패키지 컨텍스트 내에서 일관성을 보장할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3