Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用Golang解析yaml文件_Parsing_Go_Yaml - Fatal编程技术网

Parsing 使用Golang解析yaml文件

Parsing 使用Golang解析yaml文件,parsing,go,yaml,Parsing,Go,Yaml,我正试图用Golang解析一个yaml文件。我定义了以下类型: type DockerNetwork struct { MyNetwork struct { driver string } `yaml:"my_network"` } // DockerNetworks represent the docker Networks type type DockerNetworks struct { networks []DockerNetwork } 所以我有了我

我正试图用Golang解析一个
yaml
文件。我定义了以下
类型

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:
{{}}

我做错了什么?

有问题,有未报告字段的数据结构和与您的数据结构不匹配的测试数据

像这样的东西可以让你尝试一下:

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

很难说,你认为什么是“有效的”。

我的
yaml
文件是一个
docker compose.yml
文件,格式如上所述(它的一部分)。我同意马吕斯的说法,我有未报告的字段,这是一个错误。我使用的解决方案是
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)

错误消息中究竟有什么不清楚的地方?您的YAML是一个映射,不能将映射解组到切片。那么也许可以使用映射?@Volker让我重新表述我的问题…@Volker我已经更新了我的问题您的结构中有未报告的字段,而您的yaml中仍然只有映射。您必须使用大写字母编写
网络
驱动程序
字段,以使它们公开,这里的主要问题是输出来自一个
docker compose.yml
文件,该文件将被解析并与docker go API一起使用。docker compose输出没有该格式。我用地图解决了这个问题。