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 중국어 웹사이트의 기타 관련 기사를 참조하세요!