Wie kann ich ein YAML-Feld dynamisch in bestimmte Strukturen in Go analysieren?

Susan Sarandon
Freigeben: 2024-10-31 03:50:01
Original
692 Leute haben es durchsucht

How Can I Dynamically Parse a YAML Field to Specific Structs in Go?

YAML-Feld dynamisch in vordefinierte Strukturen in Go analysieren

Für eine YAML-Datei, in der ein bestimmtes Feld durch einen beliebigen Wert aus einem vorgegebenen Satz von Strukturen dargestellt werden kann, ist eine geeignete Der Ansatz wäre die Verwendung der UnmarshalYAML-Methode des YAML-Pakets. Dies ermöglicht die Erstellung einer benutzerdefinierten Unmarshaling-Logik für bestimmte Typen.

YAML v2

Mit YAML v2 erreicht der folgende Code das gewünschte Verhalten:

<code class="go">type yamlNode struct {
    unmarshal func(interface{}) error
}

func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
    n.unmarshal = unmarshal
    return nil
}

type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
Nach dem Login kopieren
<code class="go">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)
}</code>
Nach dem Login kopieren

YAML v3

Verwenden Sie für YAML v3 den folgenden Code:

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
Nach dem Login kopieren
<code class="go">func (s *Spec) UnmarshalYAML(n *yaml.Node) error {
    type S Spec
    type T struct {
        *S   `yaml:",inline"`
        Spec yaml.Node `yaml:"spec"`
    }

    obj := &T{S: (*S)(s)}
    if err := n.Decode(obj); err != nil {
        return err
    }

    switch s.Kind {
    case "foo":
        s.Spec = new(Foo)
    case "bar":
        s.Spec = new(Bar)
    default:
        panic("kind unknown")
    }
    return obj.Spec.Decode(s.Spec)
}</code>
Nach dem Login kopieren

Dieser Ansatz bietet eine einfache und elegante Möglichkeit, YAML-Daten in einen vordefinierten Satz von Strukturen zu entmarshalieren und gleichzeitig zu vermeiden zusätzliche Analyseschritte oder übermäßiger Speicherverbrauch.

Das obige ist der detaillierte Inhalt vonWie kann ich ein YAML-Feld dynamisch in bestimmte Strukturen in Go analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!