>  기사  >  백엔드 개발  >  Go에서 메소드 상속을 위해 임베디드 구조체를 대체할 수 있나요?

Go에서 메소드 상속을 위해 임베디드 구조체를 대체할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 02:54:28799검색

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

임베디드 구조체 및 메서드 상속

메서드 상속을 위해 임베디드 구조체에 대한 대안이 있습니까?

예, 있습니다. 포함된 구조체를 사용하지 않고 유형의 메서드를 상속하는 대체 방법입니다. 그러나 Go의 유형 시스템에 대한 더 깊은 이해가 필요합니다.

임베디드 구조체

Go에서 구조체를 삽입하면 포함된 구조체의 필드와 메서드에 액세스할 수 있습니다. 마치 포함하는 구조체의 일부인 것처럼 보입니다. 이는 유형 간 상속을 생성하는 데 사용할 수 있는 강력한 기능입니다.

알림

구조체를 포함할 때 포함된 구조체의 메소드 세트는 그렇지 않습니다. 포함하는 구조체로 자동 승격됩니다. 메서드를 승격하려면 포함된 구조체가 익명이어야 합니다.

메서드 승격

메서드 승격은 익명의 포함된 구조체의 메서드에 액세스할 수 있도록 허용하는 언어 기능입니다. 그것들은 포함하는 구조체의 메서드였습니다. 이는 다음 규칙을 따르면 됩니다.

  • 익명 필드에 유형 T가 있는 경우 승격된 메서드에는 T 및 *T 유형의 수신자가 있습니다.
  • 익명 필드에 *T 유형이 있는 경우 , 승격된 메소드에는 T 또는 *T 유형의 수신자가 있습니다.

다음 코드를 고려하세요.

<code class="go">type Props map[string]interface{}

func (p Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := Node{"test": "foo"}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>

여기서 예를 들어 Node 구조체에는 Props 유형의 익명 구조체가 포함되어 있습니다. 이를 통해 Props의 GetString 메서드를 Node로 승격할 수 있습니다.

대체 접근 방식

임베딩이 없는 대안 접근 방식은 포인터 수신기를 사용하는 것입니다. 수신자 함수에 대한 포인터를 전달하면 이를 포함하지 않고도 기본 구조체의 필드와 메서드에 액세스할 수 있습니다.

다음은 대체 구현입니다. 포인터 수신기 사용:

<code class="go">type Props map[string]interface{}

func (p *Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := &Node{Props{"test": "foo"}}
    fmt.Println(node.GetString("test")) // Output: foo
}</code>

이 예에서는 GetString 메서드에 포인터 수신기를 사용합니다. 이를 통해 기본 Props 구조체를 삽입하지 않고도 기본 Props 구조체의 필드와 메서드에 액세스할 수 있습니다.

결론

삽입된 구조체는 상속을 위한 강력한 도구이지만, 항상 최선의 선택은 아닙니다. 메소드 승격이 바람직하지 않거나 필요하지 않은 경우 포인터 수신기를 사용하면 보다 유연하고 성능이 뛰어난 대안을 제공할 수 있습니다.

위 내용은 Go에서 메소드 상속을 위해 임베디드 구조체를 대체할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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