使用Golang解析yaml文件

时间:2016-12-14 21:21:31

标签: parsing go yaml

我尝试使用Golang解析yaml文件。我定义了以下types

type DockerNetwork struct {
   MyNetwork struct {
      driver string
   } `yaml:"my_network"`
}

// DockerNetworks represent the docker Networks type
type DockerNetworks struct {
    networks []DockerNetwork
}

所以我进行了单元测试:

func TestDockerNetwork(t *testing.T) {
    dn := DockerNetworks{}
    var data = `
networks:
   my_network:
     driver: bridge
    `
    err := yaml.Unmarshal([]byte(data), &dn)
    if err != nil {
        log.Fatalf("error: %v", err)
        t.Error("Could not Unmarshal the data")
    }
    log.Println(fmt.Sprintf("--- t:\n%v\n\n", dn))
}

我预计它会起作用,但我没有得到任何意见:

2016/12/14 13:38:12 --- t:
{{}}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我的yaml文件是docker-compose.yml文件,其格式为上述格式(部分内容)。我同意Marius的说法,我有未经报道的字段,这是一个错误。我使用的解决方案是map

m := make(map[interface{}]interface{})

err = yaml.Unmarshal([]byte(data), &m)
if err != nil {
   log.Fatalf("error: %v", err)
}
fmt.Printf("--- m:\n%v\n\n", m)

答案 1 :(得分:0)

AFAIKT那里的东西,包含未导出字段的数据结构和与您的数据结构不匹配的测试数据。

这样的事情会让你感动:

type DockerNetwork struct {
    MyNetwork struct {
        Driver string `yaml:driver`
    } `yaml:"my_network"`
}

type DockerNetworks struct {
    Networks []DockerNetwork `yaml:networks`
}

测试数据:

networks:
-  my_network:
    driver: bridge

给出一个输出:

2016/12/14 23:47:23 --- t:
{[{{bridge}}]}


PASS

很难说,什么是"工作"在你看来。