【问题标题】:Parsing a yaml file with Golang使用 Golang 解析 yaml 文件
【发布时间】:2017-04-30 08:41:13
【问题描述】:

我正在尝试使用 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:
{{}}

我做错了什么?

【问题讨论】:

  • 错误信息中到底有什么不清楚的地方?您的 YAML 是一个映射,并且映射不能被解组为一个切片。所以也许使用地图?
  • @Volker 让我重新提出我的问题...
  • @Volker 我已经更新了我的问题
  • 您的结构中有未导出的字段,而您的 yaml 中仍然只有映射。
  • 您必须将networks 和driver 字段的首字母大写才能公开

标签: parsing go yaml


【解决方案1】:

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

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

【讨论】:

  • Marius,这里的主要问题是输出来自docker-compose.yml 文件,该文件将被解析并与 docker go API 一起使用。 docker-compose 输出没有这种格式。我通过使用地图解决了这个问题。
【解决方案2】:

我的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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2021-05-17
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多