首頁  >  文章  >  後端開發  >  如何在 Go 中將 YAML 欄位動態解析為有限結構集?

如何在 Go 中將 YAML 欄位動態解析為有限結構集?

Barbara Streisand
Barbara Streisand原創
2024-10-30 23:11:30209瀏覽

How to Dynamically Parse a YAML Field into a Finite Set of Structs in Go?

在 Go 中將 YAML 欄位動態解析為有限結構體

簡介

在 Go 中將 YAML 解析為結構體非常簡單。但是,當 YAML 欄位可以表示多個可能的結構時,任務就會變得更加複雜。本文探討了使用 Go 的 YAML 套件的動態方法。

使用YAML v2 進行動態解組

對於Yaml v2,可以使用以下方法:

<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>
<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>

使用YAML v3 進行動態解組

使用YAML v3 進行動態解組
<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"
}</code>
<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>
對於Yaml v3,方法略有不同:

結論這些動態解組技術允許靈活解析將YAML 字段轉換為一組有限的結構,提供比建議的解決方法更優雅、更有效率的解決方案。請隨意探索提供的程式碼片段並根據您的具體要求優化方法。

以上是如何在 Go 中將 YAML 欄位動態解析為有限結構集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn