【问题标题】:Read and write Yaml files with Go [closed]使用 Go 读写 Yaml 文件 [关闭]
【发布时间】:2019-12-19 09:40:08
【问题描述】:

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

我想知道 Go 中是否有一个库,你只需给它文件的路径,它就会动态读取 yaml 文件?我想要python之类的东西,它可以读取文件,然后你可以访问类似于字典或数据的数据['k1']['k2'],当你完成编辑后,只需将其写回文件。

更新

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

【问题讨论】:

  • Go 是一种静态类型的语言,就其本质而言并不适合这项任务。这当然是可能的,但您最终会在代码中看到大量类型断言。
  • @Peter YAML 文档是包含异构集合的复合值。虽然它肯定不像同构结构那样容易处理,但我拒绝静态语言不适合处理它的说法。请记住,AST 也是一种非常异构的结构,但大多数编译器都是用静态类型语言实现的。 Python 代码处理 YAML 通常对结构进行隐式假设,因此可以通过键入使这些假设显式转换为 Go。 Python 代码访问失败,加载 Go 代码。
  • @AVarf 阅读链接的 on-topic 帮助页面中的 4. 要点。问题是您专门要求图书馆。相反,您应该只描述您真正想要做什么以及为什么它不适用于您链接的解决方案。然后有人可以建议一个不同的库,或者告诉你如何使用链接问题中使用的gopkg.in/yaml.v3 库来做到这一点。目前,您的问题有点像“我想使用 Go 但不想声明类型”,因此您应该例如描述为什么你不能使用map[string]map[string]int 作为目标类型,这将允许[] 语法。

标签: go yaml


【解决方案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 来遍历该结构并向下查找这些节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多