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

如何在 Go 中將 YAML 欄位動態解析為特定結構?

Susan Sarandon
Susan Sarandon原創
2024-10-31 03:50:01668瀏覽

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

將YAML 欄位動態解析為Go 中的預定義結構

對於YAML 文件,其中特定欄位可以由預定結構集中的任何值表示,合適的方法是利用YAML 套件的UnmarshalYAML 方法。這允許為特定類型建立自訂解組邏輯。

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 資料解組到一組預先定義的結構中,同時避免額外的解析步驟或過多的記憶體消耗。

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

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