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

读取文件中的多个 yaml

读取文件中的多个 yaml

Go
函数式编程 2023-05-15 09:44:43
如何像 kubectl 那样解析一个文件中的多个 yaml?例子.yaml---a: Easy!b:  c: 0  d: [1, 2]---a: Peasy!b:  c: 1000  d: [3, 4]
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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


查看完整回答
反对 回复 2023-05-15
?
炎炎设计

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

Currentgopkg.in/yaml.v3 Deocder产生非常正确的结果,您只需要注意为每个文档创建新结构并检查它是否被正确解析(使用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"

---


查看完整回答
反对 回复 2023-05-15
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我发现使用的解决方案gopkg.in/yaml.v2:


package main


import (

    "bytes"

    "fmt"

    "io/ioutil"

    "log"

    "path/filepath"


    "gopkg.in/yaml.v2"

)


type T struct {

        A string

        B struct {

                RenamedC int   `yaml:"c"`

                D        []int `yaml:",flow"`

        }

}


func main() {

    filename, _ := filepath.Abs("./example.yaml")

    yamlFile, err := ioutil.ReadFile(filename)

    if err != nil {

        panic(err)

    }


    r := bytes.NewReader(yamlFile)


    dec := yaml.NewDecoder(r)


    var t T

    for dec.Decode(&t) == nil {


      fmt.Printf("a :%v\nb :%v\n", t.A, t.B)


    }

}


查看完整回答
反对 回复 2023-05-15
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

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