Heim >Backend-Entwicklung >Golang >Wie kann ich Gewerkschaften in Go effektiv simulieren?

Wie kann ich Gewerkschaften in Go effektiv simulieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-13 07:04:11254Durchsuche

How Can I Effectively Simulate Unions in Go?

Best Practices für Gewerkschaften in Go

Gewerkschaften sind in Go ein kontroverses Thema, da die Sprache sie nicht nativ unterstützt. Es gibt jedoch viele Situationen, in denen Gewerkschaften notwendig sind, was Entwickler dazu veranlasst, kreative Wege zu finden, um diese Einschränkung zu umgehen.

Unionen mit Containerstrukturen simulieren

Ein gängiger Ansatz besteht darin, eine Containerstruktur zu erstellen, die enthält die verschiedenen Typen, die in der Union dargestellt würden. Beispielsweise könnte man für eine XML-Struktur, die Kommentare, Verarbeitungsanweisungen oder Leerzeichen enthält, eine Containerstruktur wie folgt definieren:

type Misc struct {
    value interface {}
}

Diese Struktur kann dann verwendet werden, um jeden der drei Typen aufzunehmen:

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

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

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

Prädikate und Getter

Um den Typ des in einer Misc-Struktur gespeicherten Werts zu bestimmen, können Prädikate verwendet werden verwendet:

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 können verwendet werden, um die korrekt typisierten Elemente abzurufen:

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)
}

Typsicherheit und alternative Ansätze

Während dieser Ansatz eine Möglichkeit zur Simulation bietet Gewerkschaften bietet es keine Typensicherheit. Um Typsicherheit zu erreichen, könnte man erwägen, eine Schnittstelle zu erstellen, die etwas als Misc markiert:

type Misc interface {
    ImplementsMisc()
}

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

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

Auf diese Weise können Funktionen geschrieben werden, die nur Misc-Objekte verarbeiten, und der spezifische Typ kann später bestimmt werden.

Es ist jedoch wichtig zu beachten, dass die Nachahmung von Gewerkschaften in Go eine sorgfältige Implementierung erfordert, um unsicheren Code zu vermeiden. Wenn Typensicherheit Priorität hat, sollten alternative Ansätze wie Polymorphismus oder Generika in Betracht gezogen werden.

Das obige ist der detaillierte Inhalt vonWie kann ich Gewerkschaften in Go effektiv simulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn