在Go 中處理Union:最佳實踐調查
Go 缺乏內建的union 類型,這在某些情況下可能是一個缺點。例如,在處理 XML 對聯合的使用時,Go 開發人員必須找到替代解決方案。
一個常見的方法是建立一個容器結構體來保存可以組成聯合的不同類型。然而,這種方法可能會導致程式碼臃腫,函數和方法冗餘。
在本文中,我們將探討 Go 中是否有更好的處理聯合的方法。
目前的解決方案:冗餘程式碼
考慮建模 XML 的 Misc 非終結符的範例,它可以是註解、處理指令或空白區域。使用容器結構體實作此聯合的 Go 程式碼需要為每種類型編寫建構函式、getter 和謂詞:
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} } func (m Misc) IsComment() bool { _, ok := m.value.(*Comment); return ok } func (m Misc) Comment() *Comment { return m.value.(*Comment) }
此解冗長且重複。它缺乏 Go 常見的簡單性和優雅性。
替代方法
型切換:
Volker 提出了一種類型switch 作為可行的替代方案:
switch v := m.value.(type) { case *Comment: // Type-assert v if needed // ... }
雖然type switch減少了重複的程式碼,它仍然缺乏編譯器強制的類型安全性。
介面標記:type Misc interface { ImplementsMisc() } type Comment Chars func (c Comment) ImplementsMisc() {} type ProcessingInstruction func (p ProcessingInstruction) ImplementsMisc() {}
func myFunc(m Misc) { switch m := m.(type) { case Comment: // Type-assert m if needed // ... } }
注意事項和結論
儘管Go 中缺乏內置的聯合類型,但這些替代方法提供了處理聯合的解決方案。雖然容器結構方法複製了 Java 風格的聯合,但它需要更多的編碼工作。類型切換方法更簡單,在運行時處理聯合,但類型安全性降低。最後,介面方法在類型安全性和程式碼簡單性之間提供了折衷。
哪種方法最合適取決於開發人員願意接受的特定要求和權衡。以上是在沒有內建支援的情況下,Go 開發人員如何有效地處理聯合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!