>백엔드 개발 >Golang >Go에서 Union을 어떻게 효과적으로 시뮬레이션할 수 있나요?

Go에서 Union을 어떻게 효과적으로 시뮬레이션할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-13 07:04:11254검색

How Can I Effectively Simulate Unions in Go?

Go의 유니온 모범 사례

Go에서 유니온은 논란의 여지가 있는 주제입니다. 언어가 기본적으로 이를 지원하지 않기 때문입니다. 그러나 공용체가 필요한 상황이 많이 있으므로 개발자는 이러한 제한을 해결하기 위한 창의적인 방법을 찾게 됩니다.

컨테이너 구조체를 사용하여 공용체 시뮬레이션

한 가지 일반적인 접근 방식은 다음을 수행하는 컨테이너 구조체를 만드는 것입니다. 공용체에서 표현될 다양한 유형을 보유합니다. 예를 들어 주석, 처리 지침 또는 공백이 포함된 XML 구조의 경우 다음과 같이 컨테이너 구조체를 정의할 수 있습니다.

type Misc struct {
    value interface {}
}

이 구조체는 세 가지 유형 중 하나를 보유하는 데 사용할 수 있습니다.

func MiscComment(c *Comment) *Misc {
    return &Misc{c}
}

func MiscProcessingInstruction (pi *ProcessingInstruction) *Misc {
    return &Misc{pi}
}

func MiscWhiteSpace (ws *WhiteSpace) *Misc {
    return &Misc{ws}
}

술어 및 게터

Misc 구조체에 저장된 값의 유형을 결정하기 위해 술어는 다음과 같습니다. 사용됨:

func (m Misc) IsComment () bool {
    _, itis := m.value.(*Comment)
    return itis
}

func (m Misc) IsProcessingInstruction () bool {
    _, itis := m.value.(*ProcessingInstruction)
    return itis
}

func (m Misc) IsWhiteSpace () bool {
    _, itis := m.value.(*WhiteSpace)
    return itis
}

Getter를 사용하여 올바르게 입력된 요소를 검색할 수 있습니다.

func (m Misc) Comment () *Comment {
    return m.value.(*Comment)
}

func (m Misc) ProcessingInstruction () *ProcessingInstruction {
    return m.value.(*ProcessingInstruction)
}

func (m Misc) WhiteSpace () *WhiteSpace {
    return m.value.(*WhiteSpace)
}

유형 안전 및 대체 접근 방식

이 접근 방식은 시뮬레이션 방법을 제공합니다. 공용체에서는 유형 안전성을 제공하지 않습니다. 유형 안전성을 확보하려면 무언가를 Misc로 표시하는 인터페이스를 생성하는 것을 고려할 수 있습니다.

type Misc interface {
    ImplementsMisc()
}

type Comment Chars
func (c Comment) ImplementsMisc() {}

type ProcessingInstruction
func (p ProcessingInstruction) ImplementsMisc() {}

이렇게 하면 Misc 객체만 처리하는 함수를 작성할 수 있으며 특정 유형은 나중에 결정될 수 있습니다.

그러나 Go에서 공용체를 모방하려면 안전하지 않은 코드를 피하기 위해 신중한 구현이 필요하다는 점에 유의하는 것이 중요합니다. 유형 안전성이 최우선이라면 다형성이나 제네릭과 같은 대체 접근 방식을 고려해야 합니다.

위 내용은 Go에서 Union을 어떻게 효과적으로 시뮬레이션할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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