我有数百个具有不同结构的yaml文件(与K8和Helm有关),需要时可以使用python进行编辑。我决定学习Go,我想用go编写一个新脚本来编辑这些文件,但令人惊讶的是,我看到人们在读取yaml文件(GO reading YAML file and mapping to slice of structs和Go parse yaml file)之前正在创建yaml结构。我的意思是说,他们使用yaml文件中的所有键创建了具有正确缩进的结构。
我想知道Go中是否有一个库,您只需为其提供文件路径,它就会动态读取yaml文件?我想要类似python的东西来读取文件,然后您可以访问类似于字典或data ['k1'] ['k2']的数据,并在完成编辑后将其写回到文件中。 / p>
我不明白问图书馆有什么问题?这不是最终发生的事情吗?人们提出了不同的解决方案,其中大多数使用了不同的库。另一方面,我试图查看在何处以及如何使用Go,为什么我的问题变得离题?
答案 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
来遍历整个结构,然后下降到那些节点。