패키지 전체에서 내보내지 않은 메서드를 사용하여 인터페이스 구현
Go에서 인터페이스를 구현하려면 일반적으로 인터페이스 서명과 일치하는 내보낸 메서드를 정의해야 합니다. 그러나 구현의 접근성을 유지하는 것이 바람직하지 않은 시나리오가 있습니다. 이 기사에서는 별도의 패키지에 있는 내보내지 않은 메서드를 사용하여 인터페이스를 구현할 수 있는 가능성을 살펴봅니다.
내보내지 않은 유형 내부에 회계 시스템의 구현(accountingsystem)이 숨겨져 있는 다음 코드 조각을 고려하세요.
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
안타깝게도 이 접근 방식은 Accountingsystem 패키지에서 내보내지지 않은 getInvoice() 메서드가 다음과 같기 때문에 컴파일 오류를 생성합니다. 회계 패키지에는 표시되지 않습니다.
대체 접근 방식
익명 구조체 필드:
한 가지 해결책은 인터페이스를 구현하는 것입니다. 인터페이스 패키지 내에서 익명의 구조체 필드를 사용합니다. 이를 통해 구현을 노출하지 않고도 인터페이스를 만족시킬 수 있습니다.
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
설정 함수:
또는 등록하여 어댑터를 설정하는 별도의 함수를 생성할 수 있습니다. 내보내지 않은 유형을 어댑터로 사용:
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } package main func main() { accountingsystem.SetupAdapter() }
이 접근 방식을 사용하면 어댑터 유형을 유지할 수 있습니다. 등록 절차는 다른 부서에 위임하면서 비공개로 진행하세요.
위 내용은 패키지 전체에서 내보내지 않은 메서드를 사용하여 Go 인터페이스를 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!