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"` }
登錄后復制