首頁 > 後端開發 > Golang > 如何在不使用中間映射的情況下將 YAML 欄位動態解析為 Go 中的特定結構?

如何在不使用中間映射的情況下將 YAML 欄位動態解析為 Go 中的特定結構?

Linda Hamilton
發布: 2024-10-31 01:47:01
原創
703 人瀏覽過

How do you dynamically parse YAML fields into specific structs in Go without using an intermediate map?

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

確定將YAML 欄位動態解析為預定義結構的最佳方法可能是Go 中的常見挑戰。讓我們檢查提供的場景並探索可用的最佳選項。

挑戰

給定具有不同內容的 YAML 檔案和一組表示不同資料類型的結構,目標是動態解析這些欄位到適當的結構中。提供的方法涉及使用中間映射,但尋求更優雅的解決方案。

解決方案

利用YAML v2.1.0 Yaml 解析器,這是一種改進的方法:

<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>
登入後複製

該解決方案透過在T 類型中嵌入結構體的kind 和spec 欄位來優雅地處理動態解析。 yamlNode 類型有助於解組 Spec 接口,從而允許選擇適當的特定結構。

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 欄位動態解析為所需的結構類型,而不需要中間映射或其他步驟。

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

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