Go YAML 解析器默默地失败

Bad*_*Zen 2 tags yaml go

我正在尝试在 go 中进行简单的 YAML 解析gopkg.in/yaml.v2

文档中:

映射和指针(指向结构、字符串、int 等)被接受为输出值。如果结构中的内部指针未初始化,则 yaml 包将在必要时对其进行初始化以解组所提供的数据。out 参数不能为 nil。

解码值的类型应与输出中的相应值兼容。如果由于类型不匹配而无法解码一个或多个值,则解码将继续部分进行,直到 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: bar
b: [{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))
}
Run Code Online (Sandbox Code Playgroud)

产量

 OK
 panic: runtime error: invalid memory address or nil pointer dereference
 [signal 0xb code=0x1 addr=0x0 pc=0x4014b3]
Run Code Online (Sandbox Code Playgroud)

这似乎违反了共同文件中做出的承诺。如果我将嵌套的 YamlTypeA 设为立即数而不是指针,结果是输出值没有被触及,仍然没有错误:

 OK
 TypeA.D: 
 I have 0 TypeB
Run Code Online (Sandbox Code Playgroud)

这里给出了什么?它只是损坏/记录不完整吗?如何从 YAML 中获取要解析的嵌套结构值?(使用地图的地图很麻烦,根本不是这里的解决方案。)

Jim*_*imB 5

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

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"`
}
Run Code Online (Sandbox Code Playgroud)