Strukturinitialisierung mit eingebetteten Strukturen in Go
Das Erstellen von Strukturen ist in Go eine gängige Praxis für die Organisation und Wiederverwendung von Code. Das Initialisieren zusammengesetzter Strukturen kann jedoch eine Herausforderung darstellen, wenn ein Unterfeld von einer eingebetteten Struktur geerbt wird.
Betrachten Sie das folgende Beispiel:
type Base struct { ID string } type Child struct { Base a int b int }
Um Child zu initialisieren, könnte man erwarten, Folgendes zu verwenden Syntax:
child := Child{ ID: id, a: a, b: b }
Dies führt jedoch aufgrund der unbekannten Feld-ID im Child-Strukturliteral zu einem Kompilierungsfehler. Um dieses Problem zu umgehen, muss das ID-Feld separat initialisiert werden:
child := Child{ a: 23, b: 42 } child.ID = "foo"
Dieser Ansatz verstößt gegen Kapselungsprinzipien, indem er die Tatsache offenlegt, dass ID ein eingebettetes Feld ist. Außerdem besteht das Risiko, dass die Initialisierung unterbrochen wird, wenn ein öffentliches Feld in eine eingebettete Struktur verschoben wird.
Um dieses Problem zu beheben, gibt es zwei empfohlene Lösungen:
Verschachtelte zusammengesetzte Literale:
Verschachtelte zusammengesetzte Literale können verwendet werden, um ein eingebettetes Feld in einem einzelnen Feld zu initialisieren Ausdruck:
child := Child{Base: Base{ID: id}, a: a, b: b}
Vorgeschlagene Änderung in Go:
Go-Ausgabe 9859 schlägt eine Änderung vor, um zusammengesetzte Literale mit dem Feldzugriff für eingebettete Systeme konsistent zu machen Typen. Bei Implementierung würde diese Änderung die folgende Syntax ermöglichen:
child := Child{ ID: id, a: a, b: b }
Es ist wichtig zu beachten, dass eingebettete Typen keine Kapselung im eigentlichen Sinne bieten. Eine Anwendung kann trotz Verwendung der child.ID-Syntax immer noch direkt auf child.Base.ID zugreifen.
Das obige ist der detaillierte Inhalt vonWie kann ich eingebettete Strukturen in Go effizient initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!