英文:
Parsing Only Certain Keys in a YAML File in Golang
问题
我有一个YAML文件,我正在使用Golang读取并解组到一个结构体中。该文件包含多个键,但我只需要其中的某些键。我发现,如果我将不需要的键放在YAML文件的底部,一切都按预期工作,但如果键的顺序是随机的,解组/解析将返回意外的值。例如:
简单的示例YAML文件:
---
cat_name: rusty
dog_name: billy
cat_food: Purina
dog_food: Blue
cat_rescued: true
dog_rescued: false
cat_age: 4
dog_age: 6
happy: true
结构体定义如下:
type MyStruct struct {
Happy bool `yaml:"happy"`
CatName string `yaml:"cat_name"`
CatAge int `yaml:"cat_age"`
}
解组代码如下:
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("无法读取文件 %s。发生错误:%w", filename, err)
}
params := MyStruct{}
if err = yaml.Unmarshal(data, ¶ms); err != nil {
return nil, fmt.Errorf("无法解析来自文件的YAML:%w", err)
}
return ¶ms, nil
我发现,我会得到正确的CatName
,但其他两个字段(Happy
和CatAge
)将分别为false
和0
。
然而,如果我更改YAML文件中键的顺序,使得我需要的三个键是YAML文件中的前三个键,那么我将得到预期的数据true
和4
。
我对Golang还不太熟悉,想知道在进行了大量搜索和实验之后,我漏掉了什么?我正在使用https://github.com/goccy/go-yaml
库进行解组。在将YAML解组到结构体时,预期YAML文件中的键的顺序与结构体字段的顺序相同吗?提前感谢您的帮助。
英文:
I have a YAML file that I am reading in in Golang and unmarshaling to a struct. The file contains several keys, but I only need certain ones. What I am finding is that if I place the keys that aren't needed for this application at the bottom of the YAML file, everything works as expected, but if the keys are in random order, the unmarshaling / parsing returns unexpected values. For example:
Sample Simple YAML file:
---
cat_name: rusty
dog_name: billy
cat_food: Purina
dog_food: Blue
cat_rescued: true
dog_rescued: false
cat_age: 4
dog_age: 6
happy: true
type MyStruct struct {
Happy bool `yaml:"happy"`
CatName string `yaml:"cat_name"`
CatAge int `yaml:"cat_age"`
}
Code that does the unmarshaling:
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("Could not read file %s. An error has occurred: %w", filename, err)
}
params := MyStruct{}
if err = yaml.Unmarshal(data, &params); err != nil {
return nil, fmt.Errorf("could not parse yaml from file. %w", err)
}
return &params, nil
What I am finding is that, I will get back the correct CatName
, but that the other two fields (Happy
and CatAge
) will be false
and 0
, respectively.
However, if I change the ordering of the keys in the yaml file so that the three keys that I need for MyStruct
are the top three in the YAML file, I will get back the expected data of true
and 4
.
I am pretty new to Golang and am wondering, after doing a lot of searching and experimentation, what I am missing? I am using the https://github.com/goccy/go-yaml
library to do the unmarshaling. Is it expected when unmarshaling YAML to a struct that the order of the keys in the YAML file are in the same order as the struct fields? Thanks in advance.
答案1
得分: 1
我发现的是,我会得到正确的CatName,但是其他两个字段(Happy和CatAge)分别为false和0。
不,上述假设是不正确的。根据你的定义和代码,所有必需的字段应该按预期更新,YAML或结构字段的顺序对最终的非编组输出没有影响。
在go-yaml库的Go playground上有一个示例。
英文:
> What I am finding is that, I will get back the correct CatName, but that the other two fields (Happy and CatAge) will be false and 0, respectively.
No, the above assumption is incorrect. Per the definitions and code you have, all the required fields should be updated as expected and the ordering of keys in the YAML or struct fields has no relevance on the final un-marshalled output.
See an example with go-yaml library at Go playground
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论