임베디드 구조체 및 메서드 상속
메서드 상속을 위해 임베디드 구조체에 대한 대안이 있습니까?
예, 있습니다. 포함된 구조체를 사용하지 않고 유형의 메서드를 상속하는 대체 방법입니다. 그러나 Go의 유형 시스템에 대한 더 깊은 이해가 필요합니다.
임베디드 구조체
Go에서 구조체를 삽입하면 포함된 구조체의 필드와 메서드에 액세스할 수 있습니다. 마치 포함하는 구조체의 일부인 것처럼 보입니다. 이는 유형 간 상속을 생성하는 데 사용할 수 있는 강력한 기능입니다.
알림
구조체를 포함할 때 포함된 구조체의 메소드 세트는 그렇지 않습니다. 포함하는 구조체로 자동 승격됩니다. 메서드를 승격하려면 포함된 구조체가 익명이어야 합니다.
메서드 승격
메서드 승격은 익명의 포함된 구조체의 메서드에 액세스할 수 있도록 허용하는 언어 기능입니다. 그것들은 포함하는 구조체의 메서드였습니다. 이는 다음 규칙을 따르면 됩니다.
예
다음 코드를 고려하세요.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!