首頁  >  文章  >  後端開發  >  如何在 Go 中使用動態鍵解析 YAML?

如何在 Go 中使用動態鍵解析 YAML?

Linda Hamilton
Linda Hamilton原創
2024-11-04 02:28:29203瀏覽

How to Parse YAML with Dynamic Keys in Go?

使用Golang 在YAML 中進行動態金鑰解析

簡介

簡介

YAML不是)標記語言)是一種廣泛使用的資料序列化格式,允許靈活的資料表示。然而,在 Go 中解析具有動態鍵(即可能變化的鍵)的 YAML 檔案會帶來挑戰,因為該語言嚴重依賴靜態類型結構。

問題描述

您有一個 YAML 文件,其中金鑰代表不同的版本(例如 V1、V2、V3)。使用者可以指定他們支援哪些版本,並且密鑰可能不按順序或跳過版本。您想要將此 YAML 檔案解析為 Go 結構體,但該結構體的欄位必須與動態鍵相符。

不正確的方法

最初,您嘗試解析 YAML檔案放入環境結構中,期望鍵存在於根層級。然而,根元素的實際類型是字串(代表環境名稱)到環境結構的映射。

要使用動態鍵解析 YAML,您需要需要在結構上使用自訂 UnmarshalYAML 方法來解析鍵並建構正確的結構。在這種情況下,Environment 結構需要 UnmarshalYAML 方法將根解組為映射,然後解析各個環境。

程式碼範例
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error {
    var params struct {
        SkipHeaderValidation bool `yaml:"skip-header-validation"`
    }
    if err := unmarshal(&params); err != nil {
        return err
    }
    var versions map[string]MajorVersion
    if err := unmarshal(&versions); err != nil {
        // Here we expect an error because a boolean cannot be converted to a MajorVersion
        if _, ok := err.(*yaml.TypeError); !ok {
            return err
        }
    }
    e.SkipHeaderValidation = params.SkipHeaderValidation
    e.Versions = versions
    return nil
}</code>

這裡是一個範例環境結構的自訂 UnmarshalYAML 方法:

此方法先解組布林欄位。然後,它嘗試將其餘資料解組到版本名稱到 MajorVersion 結構的映射中。但是,由於未編組的資料是布林值和 MajorVersion 結構的混合,因此將引發 yaml.TypeError 。程式碼會忽略此錯誤,並將未編組的版本對應指派給環境結構的 Versions 欄位。

範例用法
<code class="go">var e map[string]Environment
if err := yaml.Unmarshal([]byte(data), &e); err != nil {
    fmt.Println(err.Error())
}
fmt.Printf("%#v\n", e)</code>

使用自訂UnmarshalYAML 方法,您可以現在正確解組YAML 資料:
map[string]main.Environment{
    "development": {
        SkipHeaderValidation: true,
        Versions:             {
            "V2": {
                Current:                "2.0.0",
                MimeTypes:              {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"},
                SkipVersionValidation:  false,
                SkipMimeTypeValidation: false,
            },
            "V1": {
                Current:                "1.0.0",
                MimeTypes:              {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"},
                SkipVersionValidation:  true,
                SkipMimeTypeValidation: true,
            },
        },
    },
}

這將產生以下輸出: 這示範如何成功將具有動態鍵的YAML 檔案解析為Go 結構。

以上是如何在 Go 中使用動態鍵解析 YAML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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