Go YAML解析器无声地失败

时间:2015-12-15 20:45:00

标签: go tags yaml

我正在尝试使用gopkg.in/yaml.v2进行简单的YAML解析。

来自the documentation

  

地图和指针(对于struct,string,int等)被接受为   出价值。如果结构中的内部指针不是         初始化后,yaml包将在必要时初始化它         用于解组提供的数据。 out参数不能为零。

     

解码值的类型应与         各自的价值观。如果一个或多个值无法解码         由于类型不匹配,解码继续部分直到         YAML内容的结尾,并返回* yaml.TypeError         所有遗漏值的详细信息。

注意这里的重要位:"如果nec' y"则初始化struct中的指针;如果值不能被解码,则返回" yaml.TypeError"。

现在:

package main

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

产量

 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 个答案:

答案 0 :(得分:4)

你的struct标签中有空格,所以它们被忽略了:

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"`
}