dynamisch an Yaml -Feldern an eine endliche Reihe von Strukturen in go
yaml -Dateien sind eine gemeinsame Aufgabe in vielen Anwendungen. Manchmal kann jedoch eine YAML -Datei Felder enthalten, die durch verschiedene Arten von Strukturen dargestellt werden müssen. Dies kann zu komplexen Code und überfüllten YAML -Dateien führen.
Betrachten Sie beispielsweise die folgenden YAML -Dateien:
kind: "foo"
spec:
fooVal: 4
kind: "bar"
spec:
barVal: 5
und die entsprechenden Strukturen zum Parsen:
type Spec struct {
Kind string `yaml:"kind"`
Spec interface{} `yaml:"spec"`
}
type Foo struct {
FooVal int `yaml:"fooVal"`
}
type Bar struct {
BarVal int `yaml:"barVal"`
}
Ein Ansatz besteht darin, eine Karte [String] -Rittel {} als Typ für das Spezifikationsfeld zu verwenden. Dieser Ansatz kann jedoch zu zusätzlichen Komplexität und Speicherkonsum führen, insbesondere für große YAML -Dateien.
Eine elegantere Lösung besteht darin, die YAMLNODE -Struktur zu verwenden:
type yamlNode struct {
unmarshal func(interface{}) error
}
func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
n.unmarshal = unmarshal
return nil
}
und ändern Sie die Spezifikationsstruktur, um sie zu verwenden:
type Spec struct {
Kind string `yaml:"kind"`
Spec interface{} `yaml:"-" json:"-"`
}
Mit diesen Änderungen kann die Funktion unmarchshalyaml für die Spezifikation das Spezifikationsfeld dynamisch analysieren und unmarshal in einen spezifischen Struktur -Typ analysieren und unmarshal analysieren:
func (s *Spec) UnmarshalYAML(unmarshal func(interface{}) error) error {
type S Spec
type T struct {
S `yaml:",inline"`
Spec yamlNode `yaml:"spec"`
}
obj := &T{}
if err := unmarshal(obj); err != nil {
return err
}
*s = Spec(obj.S)
switch s.Kind {
case "foo":
s.Spec = new(Foo)
case "bar":
s.Spec = new(Bar)
default:
panic("kind unknown")
}
return obj.Spec.unmarshal(s.Spec)
}
Dieser Ansatz bietet eine elegantere und effizientere Lösung, um YAML -Felder dynamisch in einen endlichen Satz von Strukturen zu analysieren, wodurch Ihre Code- und YAML -Dateien viel sauberer und einfacher zu verwalten sind.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3