-
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) }}