我需要读取yaml文件并更改一些属性值并将其写回FS。
文件内容是这样的
ID: mytest
mod:
- name: user
type: dev
parameters:
size: 256M
build:
builder: mybuild
type OBJ struct {
Id string `yaml:"ID"`
Mod []*Mod `yaml:"mod,omitempty"`
}
type Mod struct {
Name string
Type string
Parameters Parameters `yaml:"parameters,omitempty"`
Build Parameters `yaml:"build,omitempty"`
}
我需要从输出中省略type
属性
ID: mytest
mod:
- name: user
parameters:
size: 256M
build:
builder: mybuild
问题在于,我可以阅读它,我可以更改属性值但不能删除密钥(type
)
我使用的代码
yamlFile, err := ioutil.ReadFile("test.yaml")
//Here I parse the file to the model I’ve which is working fine
err := yaml.Unmarshal([]byte(yamlFile), &obj)
if err != nil {
log.Printf("Yaml file is not valid, Error: " + err.Error())
os.Exit(-1)
}
现在我能够循环使用像
这样的属性obj := models.OBJ{}
for i, element := range obj.Mod {
//Here I was able to change property data
mta.Mod[i].Name = "test123"
但不确定在回写FS时如何省略type
的整个属性。
我使用这个操作系统: https://github.com/go-yaml/yaml/tree/v2
答案 0 :(得分:2)
你只需要添加:
type Mod struct {
Name string `yaml:"name"`
Type string `yaml:"type,omitempty"` // note the omitempty
Parameters Parameters `yaml:"parameters,omitempty"`
Build Parameters `yaml:"build,omitempty"`
}
现在如果你这样做(如果你愿意,可以在内部循环):
obj.Mod[0].Type = "" // set to nil value of string
byt, _ := yaml.Marshal(obj)
并将byt
写入文件,该类型将被删除。
要点是具有omitempty
标记的任何结构字段,当使用yaml.Marshal
进行编组时,如果字段为空,则忽略(删除)字段/ strong>(又名nil
}。
official documentation中的更多信息。
答案 1 :(得分:1)
如果您想从整个YAML中省略type
,则可以将数据编组为type
不存在的对象
type OBJ struct {
Id string `yaml:"ID"`
Mod []*Mod `yaml:"mod,omitempty"`
}
type Mod struct {
Name string
//Type string `yaml:"type"`
Parameters Parameters `yaml:"parameters,omitempty"`
Build Parameters `yaml:"build,omitempty"`
}
如果您将数据编组到此对象中, type
将被删除。
另一种解决方案,如果您不想使用多个对象。
在“类型”中使用omitempty
。因此,当Type的值为""
时,它将被忽略
type Mod struct {
Name string
Type string `yaml:"type,omitempty"`
Parameters Parameters `yaml:"parameters,omitempty"`
Build Parameters `yaml:"build,omitempty"`
}
并且这样做
for i, _ := range obj.Mod {
obj.Mod[i].Type = ""
}