Warum Unterstrich-Felder in Go-Strukturen verwenden
Lukas Schneider
DevOps Engineer · Leapcell

Vorwort
In der Go-Programmiersprache sehen wir oft die Verwendung des Unterstrichs (_
), beispielsweise als Platzhalter, um unerwünschte Variablen zu ignorieren, Pakete ausschließlich wegen ihrer Nebeneffekte zu importieren oder Variablen bei Typkonvertierungen zu ignorieren. Die meisten Leute sind jedoch möglicherweise noch nicht auf die Verwendung eines Unterstrichs innerhalb einer Struktur gestoßen – insbesondere auf die Definition eines Strukturfelds namens _
.
Was ist also der Zweck der Definition eines solchen Felds?
Codevergleich: Strukturen mit und ohne Unterstrichfelder (_
)
Schauen wir uns zunächst ein Beispiel für eine Struktur ohne Unterstrichfeld (_
) an.
Im Paket model
definieren wir eine User
-Struktur mit zwei Feldern: Name
und Age
.
type User struct { Name string Age int }
Wir deklarieren Strukturvariablen sowohl mit positioneller als auch mit benannter Feldinitialisierung.
user := model.User{"Alice", 18} user = model.User{Name: "Alice", Age: 18}
Im obigen Code gibt es keine Probleme beim Definieren oder Deklarieren der Struktur.
Schauen wir uns nun ein Beispiel an, in dem die Struktur ein Unterstrichfeld (_
) enthält:
Im Paket model
definieren wir eine User
-Struktur mit drei Feldern: Name
, Age
und _
.
type User struct { Name string Age int _ struct{} }
Wir deklarieren Strukturvariablen sowohl mit positioneller als auch mit benannter Feldinitialisierung.
// Kompilierungsfehler: zu wenige Werte im Struktur-Literal vom Typ model.User user := model.User{"Alice", 18} // Kompilierungsfehler: implizite Zuweisung zu nicht exportiertem Feld _ im Struktur-Literal vom Typ model.User user = model.User{"Alice", 18, struct{}{}} // Gültig user = model.User{} user = model.User{Name: "Alice", Age: 18}
Im obigen Beispiel erzeugt das Programm Kompilierungsfehler, wenn Sie eine Strukturvariable mit user := model.User{"Alice", 18}
oder model.User{"Alice", 18, struct{}{}}
deklarieren, da dies beides positionelle Initialisierungsmethoden sind. Die Verwendung der Nullwertinitialisierung oder der benannten Feldinitialisierung funktioniert jedoch problemlos.
Durch den Vergleich der Strukturbeispiele mit und ohne das Unterstrichfeld (_
) können wir den Zweck der Definition eines solchen Felds ableiten: Das Hinzufügen eines Felds namens _
in einer Struktur erzwingt effektiv, dass die Struktur mithilfe der benannten Feldinitialisierung initialisiert wird (außer in Fällen der Nullwert-Strukturvariablendeklaration).
Kurze Analyse des Prinzips
Wenn wir eine Struktur mithilfe der positionellen Initialisierung deklarieren, müssen wir Werte für alle Felder in der exakten Reihenfolge angeben, in der sie definiert sind.
Wenn eine Struktur ein Feld namens _
enthält und wir die positionelle Initialisierung verwenden, ohne einen Wert für das Feld _
anzugeben, erzeugt der Compiler eine Fehlermeldung wie:
zu wenige Werte im Struktur-Literal vom Typ XXX
Dies liegt daran, dass nicht alle Feldwerte angegeben wurden.
Selbst wenn wir Werte für alle Felder in der richtigen Reihenfolge angeben, gibt der Compiler immer noch einen Fehler aus:
implizite Zuweisung zu nicht exportiertem Feld _ im Struktur-Literal vom Typ XXX
Dies liegt daran, dass das Feld _
mit einem Kleinbuchstaben beginnt und daher als nicht exportiert gilt. Wir können einem nicht exportierten Feld keinen Wert mithilfe der positionellen Initialisierung zuweisen. Infolgedessen ist es nicht möglich, diese Struktur auf diese Weise zu initialisieren.
Zusammenfassend lässt sich sagen, dass wir nur zwei gültige Ansätze haben, da Strukturvariablen mit einem Unterstrichfeld (_
) nicht mithilfe der positionellen Initialisierung deklariert werden können: Nullwertinitialisierung oder benannte Feldinitialisierung.
Fazit
Durch diese Diskussion haben wir etwas über die spezielle Verwendung eines Unterstrichs (_
) als Feldname in Go-Strukturdefinitionen gelernt.
Insbesondere kann das Definieren eines Felds namens _
die benannte Feldinitialisierung beim Erstellen von Instanzen der Struktur effektiv erzwingen und die Verwendung der positionellen Initialisierung verhindern. Die Vorteile dieses Ansatzes sind:
- Code-Lesbarkeit: Die benannte Feldinitialisierung verbessert die Lesbarkeit und Wartbarkeit, indem sie jeden Wert explizit einem Feldnamen zuordnet.
- Fehlervermeidung: Die positionelle Initialisierung beruht auf der strikten Einhaltung der Feldreihenfolge, was sie fehleranfällig macht. Die benannte Feldinitialisierung eliminiert dieses Risiko.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Mehrsprachige Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklungsumgebung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur mühelosen Bewältigung hoher Parallelität.
- Kein operativer Aufwand – konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ