登录
首页 >  Golang >  Go问答

读取文件中的多个 yaml

来源:stackoverflow

时间:2024-04-12 17:09:35 263浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《读取文件中的多个 yaml》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

如何解析一个文件中的多个 yaml,类似于 kubectl 的做法?

example.yaml

---
a: Easy!
b:
  c: 0
  d: [1, 2]
---
a: Peasy!
b:
  c: 1000
  d: [3, 4]

解决方案


gopkg.in/yaml.v2 和 gopkg.in/yaml.v3 之间的行为存在差异:

v2:https://play.golang.org/p/XScWhdPHukO v3:https://play.golang.org/p/OfFY4qH5wW2

两种实现都会产生不正确的结果恕我直言,但 v3 显然稍差一些。

有一个解决方法。如果您稍微更改接受的答案中的代码,它可以正常工作,并且与两个版本的 yaml 包的方式相同:https://play.golang.org/p/r4ogBVcRLCb

当前 gopkg.in/yaml.v3 decoder 产生非常正确的结果,您只需要在为每个文档创建新结构时要注意并检查它是否被正确解析(使用 nil 检查),并正确处理 eof 错误:

package main

import "fmt"
import "gopkg.in/yaml.v3"
import "os"
import "errors"
import "io"

type spec struct {
    name string `yaml:"name"`
}

func main() {
    f, err := os.open("spec.yaml")
    if err != nil {
        panic(err)
    }
    d := yaml.newdecoder(f)
    for {
        // create new spec here
        spec := new(spec)
        // pass a reference to spec reference
        err := d.decode(&spec)
        // check it was parsed
        if spec == nil {
            continue
        }
        // break the loop in case of eof
        if errors.is(err, io.eof) {
            break
        }
        if err != nil {
            panic(err)
        }
        fmt.printf("name is '%s'\n", spec.name)
    }
}

测试文件spec.yaml

---
name: "doc first"
---
name: "second"
---
---
name: "skip 3, now 4"
---

好了,本文到此结束,带大家了解了《读取文件中的多个 yaml》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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