使用Go读写Yaml文件

时间:2019-12-19 09:40:08

标签: go yaml

我有数百个具有不同结构的yaml文件(与K8和Helm有关),需要时可以使用python进行编辑。我决定学习Go,我想用go编写一个新脚本来编辑这些文件,但令人惊讶的是,我看到人们在读取yaml文件(GO reading YAML file and mapping to slice of structsGo parse yaml file)之前正在创建yaml结构。我的意思是说,他们使用yaml文件中的所有键创建了具有正确缩进的结构。

我想知道Go中是否有一个库,您只需为其提供文件路径,它就会动态读取yaml文件?我想要类似python的东西来读取文件,然后您可以访问类似于字典或data ['k1'] ['k2']的数据,并在完成编辑后将其写回到文件中。 / p>

更新

我不明白问图书馆有什么问题?这不是最终发生的事情吗?人们提出了不同的解决方案,其中大多数使用了不同的库。另一方面,我试图查看在何处以及如何使用Go,为什么我的问题变得离题?

1 个答案:

答案 0 :(得分:1)

您可以告诉yaml程序包解组到一个空接口:

package main

import (
    "gopkg.in/yaml.v3"
    "reflect"
)

func main() {
    var data interface{}
    yaml.Unmarshal([]byte("foo: bar"), &data)
    println(reflect.TypeOf(data).String())
}

这将输出:

map[string]interface {}

您将获得一个结构,该结构由映射,切片或标量类型组成,具体取决于输入。由于Go的静态类型系统,您需要使用反射/强制转换来访问实际值。

或者,您也可以将其编组为一个节点:

package main

import (
    "gopkg.in/yaml.v3"
)

func main() {
    var data yaml.Node
    yaml.Unmarshal([]byte("foo: bar"), &data)
    println(data.Kind)
}

这将打印1,即DocumentNode。非标量节点将其子级保留在Content字段中;您可以通过检查每个节点的Kind来遍历整个结构,然后下降到那些节点。