如何使用任意键解析 YAML

Ste*_*n D 4 yaml go

我正在尝试读取类似于我在 Python 中所做的 YAML 文件。但我不知道如何使用任意键。我有以下 YAML 我想阅读:

apple:
  name: item1
banana:
  name: item2
Run Code Online (Sandbox Code Playgroud)

我知道如何读入文件,但只使用空接口。我想将它作为我的项目类型的映射来阅读。

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)
}
Run Code Online (Sandbox Code Playgroud)

我在标准输出中得到了什么:

map[apple:map[name:item1] banana:map[name:item2]]
Run Code Online (Sandbox Code Playgroud)

我想看到的是:

map[apple:{item1} banana:{item2}] 
Run Code Online (Sandbox Code Playgroud)

如何将我的 YAML 文件读入项目地图?

May*_*tel 6

为了让解组以您想要的方式工作,您应该提供说明。在您的情况下,如果您不想在地图中命名,请提供一个要解组的结构。

所以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)
}
Run Code Online (Sandbox Code Playgroud)

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