Go에서는 기본 구조를 넘어서 기능을 확장하는 데 상속 대신 구성을 사용하는 경우가 많습니다. 이렇게 하면 코드 명확성이 보장되고 중복이 최소화됩니다.
다른 구조체로 확장할 수 있는 메서드를 사용하여 기본 구조체를 정의하는 것이 목표인 다음 예제를 고려해 보세요.
type MyInterface interface { SomeMethod(string) OtherMethod(string) } type Base struct { B MyInterface } func (b *Base) SomeMethod(x string) { b.B.OtherMethod(x) } type Extender struct { Base } func (b *Extender) OtherMethod(x string) { // Do something... } func NewExtender() *Extender { e := Extender{} e.Base.B = &e return &e }
이 예제는 작동하지만 , 순환 구조로 인해 복잡해 보입니다. 코드 중복을 줄이고 더 읽기 쉬운 코드를 만들려면 임베딩 사용을 고려해 보세요.
임베딩을 사용하면 특정 인터페이스를 구현하는 구조체를 구성할 수 있습니다. 예를 들어 읽기 및 쓰기를 위한 좁은 인터페이스를 만들 수 있습니다.
type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) }
이러한 인터페이스를 구성하여 ReadWriter 인터페이스를 만들 수 있습니다.
type ReadWriter interface { Reader Writer }
마찬가지로 다음과 같은 구조체를 구성할 수 있습니다. Reader 및 Writer를 MyReadWriter 구조체로 구현합니다.
type MyReader struct {} func (r *MyReader) Read(p []byte) (n int, err error) { // Implements Reader interface. } type MyWriter struct {} func (w *MyWriter) Write(p []byte) (n int, err error) { // Implements Writer interface. } type MyReadWriter struct { *MyReader *MyWriter }
MyReadWriter 구조체는 이제 ReadWriter 인터페이스를 구현하므로 이 구조체 내에서 Reader 또는 Writer를 구현하는 모든 구성 요소를 사용할 수 있습니다.
이 임베딩 기술은 코드 재사용성, 종속성 주입을 촉진하고 구현하는 구성 요소의 교체를 활성화하여 테스트를 용이하게 합니다. 특정 인터페이스.
위 내용은 Go 및 상속: 코드 재사용성을 위해 구성이 상속보다 뛰어난 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!