首頁 > 後端開發 > Golang > 主體

Go 中的 YAML 自訂標籤

WBOY
發布: 2024-02-10 10:18:08
轉載
853 人瀏覽過

Go 中的 YAML 自定义标签

php小編香蕉為您介紹Go語言中的YAML自訂標籤。 YAML是一種輕量級的資料序列化格式,而Go語言作為一種強大的程式語言,自然也提供了對YAML的支援。在Go中,我們可以透過自訂標籤來定義YAML的資料結構,以便更好地解析和處理YAML資料。透過使用自訂標籤,我們可以在Go中輕鬆地將YAML資料映射到結構體中,實現更靈活、方便的資料處理。以下將詳細介紹Go中的YAML自訂標籤的使用方法和注意事項。

問題內容

我在 go 中有這些嵌套結構,並為其屬性添加了自訂標籤,

type dummyparams struct {
  param1 string `yaml:"param1"`
  param2 string `yaml:"param2"`
}

type dummy struct {
  name string `yaml:"name"`
  type string `yaml:"type"`
  params dummyparams `yaml:"params"`
}
登入後複製

我創建了一些 dummy 實例並將它們添加到切片中,

dummies := make([]dummy, 0)
dummy1 := dummy {
    name: "a"
    type: "type a"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy1)
dummy2 := dummy {
    name: "b"
    type: "type b"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy2)
登入後複製

最後我整理資料並將其寫入檔案

yamlData, err := yaml.Marshal(&dummies)
// handle error ...
writeErr := os.WriteFile("foo.yaml", yamlData, 0644)
// handle write error ...
登入後複製

但是我得到的 yaml 沒有小寫標記名稱,而是有大寫結構名稱。 有人知道為什麼會發生這種情況以及如何解決它嗎?

解決方法

歸咎於您正在使用的 yaml 實作。例如,如果您使用 gopkg.in/yaml.v3 ,它就可以工作。在 go playground 上嘗試。因此,一種解決方案是使用另一種 yaml 實現,例如 gopkg.in/yaml.v3

您在評論中提到您正在使用 https:// /pkg.go.dev/sigs.k8s.io/[電子郵件受保護]。它的套件文檔說:

簡而言之,該函式庫首先使用 go-yaml 將 yaml 轉換為 json,然後使用 json.marshaljson.unmarshal 與結構進行轉換。這意味著它有效地重複使用了 json 結構標籤以及自訂 json 方法 marshaljsonunmarshaljson ,這與 go-yaml 不同。

所以sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c554d41406c5a1d021f021c">[email」]> /a> 第一個編組到json。如果您想要小寫的欄位名稱,請使用 json 標籤而不是 yaml 標籤:

import "sigs.k8s.io/yaml"

type dummyparams struct {
    param1 string `json:"param1"`
    param2 string `json:"param2"`
}

type dummy struct {
    name   string      `json:"name"`
    type   string      `json:"type"`
    params dummyparams `json:"params"`
}
登入後複製

透過此更改,輸出包含小寫名稱(在 go playground 上嘗試):

- name: a
  params:
    param1: foo
    param2: bar
  type: type a
- name: b
  params:
    param1: foo
    param2: bar
  type: type b
登入後複製

請注意,必須使用json 標籤而不是yaml 才能使其工作只是sigs.k8s.io/<a href="/cdn-cgi/ l/email-protection" class="__cf_email__" 的一個怪癖data-cfemail="047d6569684472352a372a34">[電子郵件受保護]</a> 套件。如果您想讓它與這個套件和其他yaml實作一起使用,您可以提供兩者 jsonyaml 標籤:

type DummyParams struct {
    Param1 string `json:"param1" yaml:"param1"`
    Param2 string `json:"param2" yaml:"param2"`
}

type Dummy struct {
    Name   string      `json:"name" yaml:"name"`
    Type   string      `json:"type" yaml:"type"`
    Params DummyParams `json:"params" yaml:"params"`
}
登入後複製

以上是Go 中的 YAML 自訂標籤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!