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

Go YAML 解析器静默失败

Go YAML 解析器静默失败

Go
蝴蝶不菲 2021-11-29 16:22:06
我正在尝试使用 .yaml 进行简单的 YAML 解析gopkg.in/yaml.v2。从文档:映射和指针(指向结构、字符串、整数等)被接受为输出值。如果结构中的内部指针未初始化,则 yaml 包将在必要时初始化它以解组提供的数据。out 参数不能为零。解码值的类型应与相应的值 in out 兼容。如果由于类型不匹配而无法对一个或多个值进行解码,则部分解码会继续直到 YAML 内容结束,并返回一个 *yaml.TypeError 以及所有缺失值的详细信息。请注意此处的重要位:“如果 nec'y 则初始化结构内的指针”,以及“如果无法解码值,则返回 yaml.TypeError”。现在:包主import (    "fmt"    "gopkg.in/yaml.v2")type YamlTypeA struct {    D string    `yaml: "d"`    E string    `yaml: "e"`}type YamlTypeB struct {    F string    `yaml: "f"`}type YamlTypeC struct {    TypeA   *YamlTypeA      `yaml: "a"`    TypeB   []YamlTypeB `yaml: "b"`}func main() {    var yamlObj YamlTypeC    text := []byte(`---a:     d: foo    e: barb: [{f: "fails"},    {f: "completely"}]`)    err := yaml.Unmarshal(text,&yamlObj)    if err != nil {        fmt.Println(err.Error())        return    }    fmt.Println("OK")    fmt.Printf("TypeA.D: %s\n", yamlObj.TypeA.D)    fmt.Printf("I have %d TypeB\n", len(yamlObj.TypeB))}产量 OK panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x4014b3]这似乎违反了共同在文件中做出的承诺。如果我使嵌套的 YamlTypeA 立即而不是指针,结果是没有触及输出值,仍然没有错误: OK TypeA.D:  I have 0 TypeB这里有什么?它只是坏了/记录不全吗?如何获取嵌套的结构值来解析 YAML?(使用地图的地图很麻烦,在这里根本不是解决方案。)
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

您的结构标记中有空格,因此它们被忽略:


type YamlTypeA struct {

    D string `yaml:"d"`

    E string `yaml:"e"`

}


type YamlTypeB struct {

    F string `yaml:"f"`

}


type YamlTypeC struct {

    TypeA *YamlTypeA  `yaml:"a"`

    TypeB []YamlTypeB `yaml:"b"`

}


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

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