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

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

Mary-Kate Olsen
發布: 2024-10-29 09:49:02
原創
956 人瀏覽過

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

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

解析 YAML 檔案是許多應用程式中的常見任務。但是,有時 YAML 檔案可能包含需要由不同類型的結構表示的欄位。這可能會導致複雜的程式碼和混亂的 YAML 檔案。

例如,考慮以下YAML 檔案:

<code class="yaml">kind: "foo"
spec:
  fooVal: 4</code>
登入後複製
<code class="yaml">kind: "bar"
spec:
  barVal: 5</code>
登入後複製

以及用於解析的對應結構:

<code class="go">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"`
}</code>
登入後複製

一種方法是使用map[string ]interface{} 作為Spec 欄位的類型。然而,這種方法可能會導致額外的複雜性和記憶體消耗,特別是對於大型 YAML 檔案。

更優雅的解決方案是使用yamlNode 結構體:

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

func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
    n.unmarshal = unmarshal
    return nil
}</code>
登入後複製

並修改Spec 結構體使用它:

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-" json:"-"`
}</code>
登入後複製

透過這些更改,Spec 的UnmarshalYAML函數可以動態解析Spec 欄位並將其解組為特定的結構類型:

<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 欄位動態解析為一組有限的結構,使您的程式碼和YAML 檔案更加乾淨且易於管理。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板