聯合在 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 }
獲取器可用於檢索正確鍵入的元素:
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中有效模擬並集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!