我正在用goyaml lib阅读一个YAML文件.我打算修改它的一些条目,如果要添加的密钥还不存在,则添加一个条目.

例如:

原创YAML

root:
  entry1: val1

1个模块和1个添加目标YAML

root:
 entry1: valUpdated
 entry2: newkey added

我找不到任何允许我向YAML添加 node 的YAML库.

谢谢你的帮忙

推荐答案

如果解组为yaml.Node,则可以使用go-yaml执行此操作:

package main

import (
    "os"

    "gopkg.in/yaml.v3"
)

var input = []byte(`root:
  entry1: val1`)

func main() {
    var document yaml.Node
    if err := yaml.Unmarshal(input, &document); err != nil {
        panic(err)
    }
    data := document.Content[0]
    var rootVal *yaml.Node
    for i := 0; i < len(data.Content); i += 2 {
        node := data.Content[i]
        if node.Kind == yaml.ScalarNode && node.Value == "root" {
            rootVal = data.Content[i+1]
            break
        }
    }
    if rootVal == nil {
        panic("root key missing")
    }

    found := false
    for i := 0; i < len(rootVal.Content); i += 2 {
        node := rootVal.Content[i]
        if node.Kind != yaml.ScalarNode {
            continue
        }
        switch node.Value {
        case "entry1":
            rootVal.Content[i+1].SetString("valUpdated")
        case "entry2":
            found = true
        }
    }
    if !found {
        var key, value yaml.Node
        key.SetString("entry2")
        value.SetString("newkey added")
        rootVal.Content = append(rootVal.Content, &key, &value)
    }
    out, err := yaml.Marshal(data)
    if err != nil {
        panic(err)
    }
    os.Stdout.Write(out)
}

输出:

root:
    entry1: valUpdated
    entry2: newkey added

Playground link

Unmarshal将获得一个文档 node ,其中根 node 是唯一的内容 node .Marshal期望根 node 作为数据,因此您需要向其提供data而不是document.我真的不知道为什么API会是这样的.

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

有没有办法通过Go cmdline或IDE(IntelliJ)找出我的 struct 实现了什么接口?

如何防止程序B存档/删除围棋中程序A当前打开的文件?

如何使用中间件更改http请求的响应代码?

从 wincrypt API 到 Go 的 RC2 解密

在 .go 文件中运行一个函数和在 Go 模板中调用它有什么区别?

使用 Grafana alert 在几分钟内重复alert

regex.ReplaceAll 但如果替换则添加相同数量的字符

golang 中的可变参数函数

如何使用struct的方法清除除某些字段之外的struct值

Golang模板无法访问embedFS中的文件

如何获取多个 url 参数值

GoLang 遍历 yaml 文件

如何在循环中旋转图像以便在 golang 中创建 GIF?

使用 xml.Name 将 xml 解组为 [] struct

从 Go struct 中提取标签作为 reflect.Value

具有多个嵌入式 struct 的 Go MarshalJSON 行为

gob 解码器仅返回数组中的第一个元素

泛型:对具有返回自身的函数的类型的约束

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?