解析嵌套YAML Golang

解析嵌套YAML Golang,go,yaml,Go,Yaml,我试图用go解析一个简单的YAML文件,但遇到了一些困难 我的YAML文件如下 key1: attr1: "attr1" attr2: "attr2" attr3: "attr3" list1: ["a", "b", "c"] list2: ["d", "e", "f"] 我的围棋脚本是这样的 package main import ( "fmt" "io/ioutil" "log" "gopkg.in/yaml.v2

我试图用go解析一个简单的YAML文件,但遇到了一些困难

我的YAML文件如下

key1:
    attr1: "attr1"
    attr2: "attr2"
    attr3: "attr3"
    list1: ["a", "b", "c"]
    list2: ["d", "e", "f"]
我的围棋脚本是这样的

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

type keys struct {
    Key1 map[string]key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}

func main() {
    var d keys

    source, err := ioutil.ReadFile("test_yaml.yaml")

    if err != nil {
        log.Fatal("Couldn't read yaml file.")
    }

    err = yaml.Unmarshal(source, &d)

    if err != nil {
        log.Fatal("Couldn't parse yaml file.")
    }

    fmt.Println(d)
}
当我运行它时,我的地图是空的({map[]}已打印)。如果我将keys结构更改为map[string]interface{},它似乎获得了所有信息,但列表没有正确解释,这就是我尝试定义内部结构的原因

有人知道为什么我的key1结构不工作,而接口{}工作吗?

您的类型定义:

type keys struct {
    Key1 map[string]key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}
这意味着这种结构:

key1:
    stuff:
        attr1: "attr1"
        attr2: "attr2"
        attr3: "attr3"
        list1: ["a", "b", "c"]
        list2: ["d", "e", "f"]
    morestuff:
        attr1: "attr1"
        attr2: "attr2"
        attr3: "attr3"
        list1: ["a", "b", "c"]
        list2: ["d", "e", "f"]
因为,根据您的数据类型,
key1
应该包含一个键到结构的映射-向不存在的层次结构添加一个级别。对于您发布的YAML,您的结构应为:

type keys struct {
    Key1 key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}
您的类型定义:

type keys struct {
    Key1 map[string]key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}
这意味着这种结构:

key1:
    stuff:
        attr1: "attr1"
        attr2: "attr2"
        attr3: "attr3"
        list1: ["a", "b", "c"]
        list2: ["d", "e", "f"]
    morestuff:
        attr1: "attr1"
        attr2: "attr2"
        attr3: "attr3"
        list1: ["a", "b", "c"]
        list2: ["d", "e", "f"]
因为,根据您的数据类型,
key1
应该包含一个键到结构的映射-向不存在的层次结构添加一个级别。对于您发布的YAML,您的结构应为:

type keys struct {
    Key1 key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}