Dynamisches Schlüsselparsen in YAML mit Golang
Einführung
YAML (YAML ist nicht Markup Language) ist ein weit verbreitetes Datenserialisierungsformat, das eine flexible Datendarstellung ermöglicht. Das Parsen von YAML-Dateien mit dynamischen Schlüsseln (d. h. Schlüsseln, die variieren können) stellt in Go jedoch eine Herausforderung dar, da die Sprache stark auf statisch typisierten Strukturen basiert.
Problembeschreibung
Sie haben eine YAML-Datei, in der die Schlüssel verschiedene Versionen darstellen (z. B. V1, V2, V3). Der Benutzer kann angeben, welche Versionen er unterstützt. Die Schlüssel sind möglicherweise nicht in der richtigen Reihenfolge oder es werden Versionen übersprungen. Sie möchten diese YAML-Datei in eine Go-Struktur analysieren, aber die Felder der Struktur müssen mit den dynamischen Schlüsseln übereinstimmen.
Falscher Ansatz
Zunächst haben Sie versucht, die YAML zu analysieren Datei in eine Umgebungsstruktur und erwartet, dass die Schlüssel auf der Stammebene vorhanden sind. Der tatsächliche Typ des Stammelements ist jedoch eine Zuordnung von Zeichenfolgen (die Umgebungsnamen darstellen) zu Umgebungsstrukturen.
Lösung
Um YAML mit dynamischen Schlüsseln zu analysieren, müssen Sie Sie müssen eine benutzerdefinierte UnmarshalYAML-Methode für die Struktur verwenden, die die Schlüssel analysiert und die richtige Struktur erstellt. In diesem Fall erfordert die Umgebungsstruktur eine UnmarshalYAML-Methode, um den Stamm als Karte zu entmarshalieren und dann die einzelnen Umgebungen zu analysieren.
Codebeispiel
Hier ist ein Beispiel für a Benutzerdefinierte UnmarshalYAML-Methode für die Umgebungsstruktur:
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(¶ms); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Here we expect an error because a boolean cannot be converted to a MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
Diese Methode entmarshallt zunächst das boolesche Feld SkipHeaderValidation. Anschließend wird versucht, den Rest der Daten in eine Zuordnung von Versionsnamen zu MajorVersion-Strukturen zu entmarshalieren. Da es sich bei den nicht gemarshallten Daten jedoch um eine Mischung aus booleschen Werten und MajorVersion-Strukturen handelt, wird ein yaml.TypeError ausgelöst. Der Code ignoriert diesen Fehler und weist die nicht gemarshallte Versionszuordnung dem Feld „Versionen“ der Umgebungsstruktur zu.
Beispielverwendung
Mit der benutzerdefinierten UnmarshalYAML-Methode ist das möglich Entpacken Sie nun die YAML-Daten korrekt:
<code class="go">var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e)</code>
Dies erzeugt die folgende Ausgabe:
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
Dies demonstriert das erfolgreiche Parsen der YAML-Datei mit dynamischen Schlüsseln in eine Go-Struktur.
Das obige ist der detaillierte Inhalt vonWie analysiere ich YAML mit dynamischen Schlüsseln in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!