>백엔드 개발 >Golang >임베딩 또는 빈 인터페이스를 사용하여 Go에서 복잡한 구조체 계층 구조를 관용적으로 만드는 방법은 무엇입니까?

임베딩 또는 빈 인터페이스를 사용하여 Go에서 복잡한 구조체 계층 구조를 관용적으로 만드는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-01 14:42:12235검색

How to Idiomatically Create a Complex Hierarchy of Structs in Go Using Embedding or Empty Interfaces?

Go에서 복잡한 구조체 계층 구조를 생성하는 관용적 방법

구조체 계층 구조를 설계할 때 Go는 유형 관계를 구성하기 위한 두 가지 접근 방식, 즉 임베딩과 빈 인터페이스를 제공합니다.

빈 메소드와의 인터페이스

Go's "빈 메서드" 접근 방식은 인터페이스와 빈 메서드를 사용하여 유형 계층을 나타냅니다. 빈 메서드는 구현이 없는 메서드입니다. 그 목적은 순전히 유형이 인터페이스를 충족한다는 것을 표시하는 것입니다.

Object, Immovable, Building, Movable, Car 및 Bike 유형이 계층 구조를 형성하는 제공된 예에서 다음 구현은 빈 인터페이스를 사용하여 메서드는 관용적인 것으로 간주됩니다.

type Object interface {
  object()
}

type Immovable interface {
  Object
  immovable()
}

type Building struct {
  ...
}

type Mountain struct {
  ...
}

type Movable interface {
  Object
  movable()
}

type Car struct {
  ...
}

type Mountain struct {
  ...
}

func (*Building) object() {}
func (*Mountain) object() {}
func (*Car) object() {}
func (*Bike) object() {}
func (*Building) immovable() {}
func (*Mountain) immovable() {}
func (*Car) movable() {}
func (*Bike) movable() {}

이 메서드는 유형 관계를 명시적으로 문서화하고 호환되지 않는 할당을 방지합니다. type.

임베딩

Go는 구조체가 다른 구조체의 메서드를 상속할 수 있도록 하는 임베딩도 지원합니다. 임베딩을 사용하면 계층 구조를 다음과 같이 표현할 수 있습니다.

type ObjectImpl struct {}
func (o *ObjectImpl) object() {}

type ImmovableImpl struct {
  *ObjectImpl // Embed ObjectImpl struct
}
func (o *Immovable) immovable() {}

type Building struct {
  *ImmovableImpl // Embed ImmovableImpl struct
}

type MovableImpl struct {
  *ObjectImpl // Embed ObjectImpl struct
}
func (o *Movable) movable() {}

type Car struct {
  *MovableImpl // Embed MovableImpl struct
}

type Bike struct {
  *MovableImpl // Embed MovableImpl struct
}

임베딩은 Go의 상속과 유사한 메커니즘을 활용하여 빈 메소드 수를 줄이는 대체 접근 방식을 제공합니다.

위 내용은 임베딩 또는 빈 인터페이스를 사용하여 Go에서 복잡한 구조체 계층 구조를 관용적으로 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.