登录
首页 >  Golang >  Go问答

Go YAML v3: 读取并编组多个 YAML 文件中的多个文档

来源:stackoverflow

时间:2024-02-21 14:30:26 343浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Go YAML v3: 读取并编组多个 YAML 文件中的多个文档》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我正在尝试使用 gopkg.in/yaml.v3 读取包含以下内容的文件 多个 yaml 文档,然后编组每个单独的文档 回到 yaml。我的示例输入如下所示:

name: doc1
---
name: doc2
---
name: doc3

我能够很好地解组文件,但遇到了意外的情况 尝试封送单个文档时出错。我的代码看起来 像:

package main

import (
    "errors"
    "fmt"
    "io"

    "os"

    "gopkg.in/yaml.v3"
)

func main() {
    reader := io.reader(os.stdin)
    dec := yaml.newdecoder(reader)

    for {
        var node yaml.node
        err := dec.decode(&node)
        if errors.is(err, io.eof) {
            break
        }
        if err != nil {
            panic(err)
        }

        content, err := yaml.marshal(node)
        if err != nil {
            panic(err)
        }

        fmt.printf("found a doc\n\n%s\n", content)
    }
}

使用示例输入运行此代码会产生以下结果:

panic: yaml: expected scalar, sequence-start, mapping-start, or alias, but got document start

goroutine 1 [running]:
main.main()
        /home/lars/projects/operate-first/halberd/main.go:31 +0x451

代码似乎正确解析文档;如果我更换它 与:

package main

import (
    "errors"
    "fmt"
    "io"

    "os"

    "gopkg.in/yaml.v3"
)

func main() {
    reader := io.reader(os.stdin)
    dec := yaml.newdecoder(reader)

    for {
        var node yaml.node
        err := dec.decode(&node)
        if errors.is(err, io.eof) {
            break
        }
        if err != nil {
            panic(err)
        }

        fmt.printf("found a doc\n")
    }
}

我最终得到了我所期望的结果:

Found a doc
Found a doc
Found a doc

该问题仅在编组时出现。我是否正确使用了 v3 api?


正确答案


您的代码中有一个小错误。
应该是content,err := yaml.marshal(&node)。您错过了 &
这有效,

package main

import (
    "errors"
    "fmt"
    "io"

    "os"

    "gopkg.in/yaml.v3"
)

func main() {
    reader := io.Reader(os.Stdin)
    dec := yaml.NewDecoder(reader)

    for {
        var node yaml.Node
        err := dec.Decode(&node)
        if errors.Is(err, io.EOF) {
            break
        }
        if err != nil {
            panic(err)
        }

        content, err := yaml.Marshal(&node)
        if err != nil {
            panic(err)
        }

        fmt.Printf("Found a doc\n\n%s\n", content)
    }
}

yaml.marshal 的文档说,

来源:https://pkg.go.dev/gopkg.in/yaml.v2#Marshal

由于您尝试封送 yaml.node 这是一个结构,因此您必须将指针传递给该结构,而不是值本身,如文档所述。

到这里,我们也就讲完了《Go YAML v3: 读取并编组多个 YAML 文件中的多个文档》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>