为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法将 yaml 节点添加到 golang 中现有的 yaml 文档?

有没有办法将 yaml 节点添加到 golang 中现有的 yaml 文档?

Go
动漫人物 2023-02-21 16:31:21
我正在阅读带有 goyaml lib 的 yaml 文件。如果要添加的密钥不存在,我打算修改它的一些条目并添加一个条目。例如原始yamlroot:   entry1: val11 个模组和 1 个添加目标 yamlroot:  entry1: valUpdated  entry2: newkey added我找不到任何可以让我向 yaml 添加节点的 yaml 库。
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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

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

游乐场链接

Unmarshal获取一个以根节点作为唯一内容节点的文档节点。Marshal期望根节点作为数据,所以你输入data而不是document输入它。我不太确定为什么 API 是这样的。


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信