如何使用任意键解析YAML

时间:2019-05-20 22:52:54

标签: go yaml

我试图读取一个YAML文件,类似于我在Python中所做的事情。但是我不知道如何使用任意键。 我要阅读以下YAML:

apple:
  name: item1
banana:
  name: item2

我知道如何读取文件,但只能使用空接口。我想阅读它作为对我的商品类型的映射。

package main

import (
    "fmt"
    "log"
    "gopkg.in/yaml.v2"
)

type Item struct {
    Name string `yaml:"name"`
}

func main() {
    input := `
  apple:
    name: item1
  banana:
    name: item2`

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

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

我在Stdout中得到的东西:

map[apple:map[name:item1] banana:map[name:item2]]

我想看的是:

map[apple:{item1} banana:{item2}] 

如何将我的YAML文件读入商品地图?

2 个答案:

答案 0 :(得分:3)

为使编组工作按您想要的方式进行,您应该提供说明。如果您不想在地图上命名,请提供解组结构。

因此m := make(map[interface{}]interface{})应更改为m := make(map[string]Item)

package main

import (
    "fmt"
    "log"
    "gopkg.in/yaml.v2"
)

type Item struct {
    Name string `yaml:"name"`
}

func main() {
    input := `
  apple:
    name: item1
  banana:
    name: item2`

    m := make(map[string]Item)

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

输出:map[apple:{item1} banana:{item2}]

答案 1 :(得分:2)

您应该使用m := make(map[string]Item)