다른 패키지에 정의된 기존 유형으로 기능을 확장하는 것은 소프트웨어 개발의 일반적인 요구 사항입니다. 유형이 로컬 또는 비로컬로 분류되는 Go에서는 비로컬 유형에 새로운 메소드를 추가하는 것이 어려울 수 있습니다. 이 문서에서는 이 목표를 달성하기 위한 다양한 접근 방식을 살펴봅니다.
제공된 코드 조각은 github.com/0xor1/gorillaseed에서 경로 및 라우터 유형에 유틸리티 메서드를 추가하려는 시도를 보여줍니다. /src/서버/lib/mux 패키지. 그러나 컴파일러는 로컬이 아닌 유형에 새 메서드를 정의하는 것이 허용되지 않는다는 오류를 보고합니다.
이 제한을 극복하기 위해 Go는 다음과 같은 몇 가지 기술을 제공합니다.
1. 익명 필드로 새 구조체 정의
한 가지 접근 방식은 원래 유형을 익명 필드로 포함하는 새 구조체 유형을 만드는 것입니다. 예를 들면 다음과 같습니다.
type MyRoute struct { *mux.Route }
이를 통해 mux.Route 필드에 대한 액세스를 상속하는 MyRoute에 대한 사용자 정의 메서드를 정의할 수 있습니다.
2. 원본 유형 포함
또는 새 구조체 유형 내에 원본 유형을 명시적으로 포함할 수 있습니다.
type MyRouter struct { mux.Router }
이 접근 방식은 상속 관계에 대한 보다 명확한 정의를 제공하는 반면, 여전히 임베디드 유형의 기능을 확장할 수 있습니다.
3. 원본 유형 래핑
또 다른 옵션은 기본 기능을 원본 유형에 위임하면서 원하는 메서드를 구현하는 래퍼 유형을 만드는 것입니다. 예를 들면 다음과 같습니다.
type MyRouter struct { Router mux.Router } func (r *MyRouter) F() { // Do something r.Router.G() }
이 접근 방식은 유연성을 제공하며 원래 기능을 계속 활용하면서 래핑된 유형의 동작을 사용자 정의할 수 있습니다.
Go의 로컬 유형에는 구조체 임베딩 또는 래퍼 유형을 영리하게 사용해야 합니다. 이러한 기술을 활용하면 Go 언어의 캡슐화 원칙을 위반하지 않고 사용자 정의 기능으로 기존 유형을 향상할 수 있습니다.
위 내용은 Go에서 로컬이 아닌 유형의 기능을 어떻게 확장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!