Umgang mit Gewerkschaften in Go: Eine Best-Practice-Untersuchung
In Go fehlen integrierte Gewerkschaftstypen, was in bestimmten Szenarien ein Nachteil sein kann . Wenn es beispielsweise um die Verwendung von Unions in XML geht, müssen Go-Entwickler alternative Lösungen finden.
Ein gängiger Ansatz besteht darin, eine Containerstruktur zu erstellen, um die verschiedenen Typen zu speichern, aus denen die Union bestehen kann. Dieser Ansatz kann jedoch zu aufgeblähtem Code mit redundanten Funktionen und Methoden führen.
In diesem Artikel untersuchen wir, ob es bessere Möglichkeiten gibt, mit Gewerkschaften in Go umzugehen.
Die aktuelle Lösung : Redundanter Code
Betrachten Sie das Beispiel der Modellierung des Nicht-Terminals „Misc“ von XML, bei dem es sich um einen Kommentar, eine Verarbeitungsanweisung oder einen Leerraum handeln kann. Die Implementierung von Go-Code für diese Union mithilfe einer Containerstruktur erfordert das Schreiben von Konstruktoren, Gettern und Prädikaten für jeden Typ:
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) }
Diese Lösung ist ausführlich und repetitiv. Es fehlt die Einfachheit und Eleganz, die oft mit Go verbunden werden.
Alternative Ansätze
Typwechsel:
Volker hat einen Typ vorgeschlagen switch als praktikable Alternative:
switch v := m.value.(type) { case *Comment: // Type-assert v if needed // ... }
Während der Typwechsel sich wiederholenden Code reduziert, ist er immer noch da Es fehlt die vom Compiler erzwungene Typsicherheit.
Schnittstellenmarkierung:
Eine mögliche Lösung besteht darin, eine Schnittstelle zu erstellen, die etwas als Misc-Element identifiziert:
type Misc interface { ImplementsMisc() } type Comment Chars func (c Comment) ImplementsMisc() {} type ProcessingInstruction func (p ProcessingInstruction) ImplementsMisc() {}
Dieser Ansatz ermöglicht die Erstellung von Funktionen, die nur sonstige Objekte verarbeiten und so eine Typerzwingung ermöglichen Laufzeit:
func myFunc(m Misc) { switch m := m.(type) { case Comment: // Type-assert m if needed // ... } }
Überlegungen und Schlussfolgerungen
Trotz des Fehlens integrierter Gewerkschaftstypen in Go bieten diese alternativen Ansätze Lösungen für den Umgang mit Gewerkschaften. Während der Container-Struktur-Ansatz Unions im Java-Stil repliziert, erfordert er mehr Programmieraufwand. Der Typwechsel-Ansatz ist einfacher und verarbeitet Unions zur Laufzeit, allerdings mit geringerer Typsicherheit. Schließlich stellt der Schnittstellenansatz einen Kompromiss zwischen Typsicherheit und Einfachheit des Codes dar.
Welcher Ansatz am besten geeignet ist, hängt von den spezifischen Anforderungen und Kompromissen ab, die der Entwickler bereit ist, zu akzeptieren.
Das obige ist der detaillierte Inhalt vonWie können Go-Entwickler Gewerkschaften ohne integrierte Unterstützung effektiv handhaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!