猿问

读取文件中的多个 yaml

如何像 kubectl 那样解析一个文件中的多个 yaml?


例子.yaml


---

a: Easy!

b:

  c: 0

  d: [1, 2]

---

a: Peasy!

b:

  c: 1000

  d: [3, 4]


函数式编程
浏览 142回答 3
3回答

Smart猫小萌

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

炎炎设计

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

白猪掌柜的

我发现使用的解决方案gopkg.in/yaml.v2:package mainimport (    "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)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答