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.marshal 和 json.unmarshal 與結構進行轉換。這意味著它有效地重用了 json 結構標簽以及自定義 json 方法 marshaljson 和 unmarshaljson ,這與 go-yaml 不同。
所以 sigs.k8s.io/[email?protected] 第一個編組到 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/[電子郵件受保護] 包。如果您想讓它與這個包和其他yaml實現一起使用,您可以提供兩者 json 和 yaml 標簽:
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"`
}
登錄后復制






