我正在尝试使用go解析一个简单的YAML文件,但是遇到了一些困难。
我的YAML文件如下。
key1:
attr1: "attr1"
attr2: "attr2"
attr3: "attr3"
list1: ["a", "b", "c"]
list2: ["d", "e", "f"]
我的go脚本如下所示。
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 为空(已打印{map []})。如果将键结构更改为map [string] interface {},似乎可以获取所有信息,但是列表解释不正确,这就是为什么我尝试定义内部结构的原因。
有人知道为什么我的key1结构不起作用,但是interface {}起作用吗?
最佳答案
您的类型定义:
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"`
}
关于go - 解析嵌套的YAML Golang,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51326163/