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