go - go语言读取并合并两个yaml文件

标签 go merge yaml marshalling unmarshalling

假设我们有两个yaml文件

master.yaml

someProperty: "someVaue"
anotherProperty: "anotherValue"

override.yaml

someProperty: "overriddenVaue"

是否可以解码、合并,然后将这些更改写入文件,而不必为 yaml 文件中的每个属性定义 struct

主文件中有超过 500 个属性在执行时对服务来说一点都不重要,所以理想情况下我可以解码到映射中,进行合并并再次在 yaml 中写出但我还比较陌生,所以想听听一些意见。

我有一些代码可以将 yaml 读取到 interface 中,但我不确定然后合并两者的最佳方法。

var masterYaml interface{}
yamlBytes, _ := ioutil.ReadFile("master.yaml")
yaml.Unmarshal(yamlBytes, &masterYaml)

var overrideYaml interface{}
yamlBytes, _ = ioutil.ReadFile("override.yaml")
yaml.Unmarshal(yamlBytes, &overrideYaml)

我研究过像 mergo 这样的库但我不确定这是否是正确的方法。

我希望在 master 之后我能够写出具有属性的文件

someProperty: "overriddenVaue"
anotherProperty: "anotherValue"

最佳答案

假设您只想在顶层进行合并,您可以解码为 map[string]interface{} 类型的映射,如下所示:

主要包

import (
    "io/ioutil"

    "gopkg.in/yaml.v2"
)

func main() {
    var master map[string]interface{}
    bs, err := ioutil.ReadFile("master.yaml")
    if err != nil {
        panic(err)
    }
    if err := yaml.Unmarshal(bs, &master); err != nil {
        panic(err)
    }

    var override map[string]interface{}
    bs, err = ioutil.ReadFile("override.yaml")
    if err != nil {
        panic(err)
    }
    if err := yaml.Unmarshal(bs, &override); err != nil {
        panic(err)
    }

    for k, v := range override {
        master[k] = v
    }

    bs, err = yaml.Marshal(master)
    if err != nil {
        panic(err)
    }
    if err := ioutil.WriteFile("merged.yaml", bs, 0644); err != nil {
        panic(err)
    }
}

关于go - go语言读取并合并两个yaml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51947879/

相关文章:

git checkout 某些文件尽管有冲突

visual-studio-2010 - TFS:是否可以在先前合并期间的源移动之后进行合并?

ruby - Psych YAML 解析包括注释

configuration - 如何解决Prometheus错误 'role missing (one of: pod, service, endpoints, node)'

recursion - 为什么 Go 计算斐波那契递归这么快?

regex - 在字符串中查找文件路径

c# - 通过编写通用递归函数合并 C# .net 中的复杂字典

go - 引用内部结构

go - 如何在Golang exec.command中添加制表符分隔符

php - 如何使用 Silex/Symfony 解析 Yaml 文件中的 HTML