다른 패키지의 동일한 서명을 사용하여 두 개의 인터페이스 구현
Go에서 인터페이스는 인터페이스를 구현하는 유형에 대한 계약을 정의하는 방법을 제공합니다. 주어진 인터페이스를 구현하는 모든 유형이 모든 메소드에 대한 구현을 제공해야 함을 보장합니다. 그러나 서로 다른 패키지에서 동일한 메서드 시그니처를 사용하여 인터페이스를 구현하면 혼란과 불일치가 발생할 수 있습니다.
다음 시나리오를 고려하세요.
<code class="go">// Package A package A type Doer interface { Do() string } func FuncA(doer Doer) { // Logic using doer.Do() } // Package B package B type Doer interface { Do() string } func FuncB(doer Doer) { // Logic using doer.Do() }</code>
이제 기본 패키지에 유형 C가 있다고 가정합니다. 이는 Do()에 대해 서로 다른 구현을 사용하여 A.Doer와 B.Doer를 모두 구현합니다. C 인스턴스를 FuncA()에 전달하면 A.Doer에 정의된 구현을 활용하여 예상대로 동작합니다. 그러나 C를 FuncB()에 전달하면 Do()의 다른 구현으로 인해 논리가 예기치 않은 동작을 트리거합니다.
이 문제를 해결하려면 두 가지 권장 접근 방식이 있습니다.
메서드 유형 주장:
Go FAQ에 따르면 "이름만으로 일치시키고 유형의 일관성을 요구하는 것은 Go의 유형 시스템에서 주요 단순화 결정이었습니다." 결과적으로 Go는 다양한 서명을 기반으로 한 오버로드 방법을 지원하지 않습니다. 그러나 메소드 유형 어설션을 수행하여 객체가 특정 인터페이스 유형을 충족하는지 확인할 수 있습니다. 예:
<code class="go">if _, ok := obj.(A.Doer); ok { // obj conforms to A.Doer // Use obj.Do() as desired }</code>
래퍼 유형:
또는 원하는 논리로 필요한 인터페이스를 구현하는 개체 주위에 래퍼 유형을 만들 수 있습니다. 예를 들어, C를 래핑하고 A.Do()의 특정 구현을 제공하는 DoerA와 C를 래핑하고 B.Do()의 구현을 제공하는 DoerB를 가질 수 있습니다. 이 접근 방식을 사용하면 적절한 래퍼 유형을 원하는 함수에 전달하여 올바른 로직이 실행되도록 할 수 있습니다.
위 내용은 Go의 서로 다른 패키지에 동일한 서명이 있는 인터페이스 구현을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!