我正在尝试将 YAML 文件解组为包含两个映射的结构(使用go-yaml)。YAML 文件:'Include': - 'string1' - 'string2''Exclude': - 'string3' - 'string4'结构:type Paths struct { Include map[string]struct{} Exclude map[string]struct{}}尝试解组的函数的简化版本(即删除错误处理等):import "gopkg.in/yaml.v2"func getYamlPaths(filename string) (Paths, error) { loadedPaths := Paths{ Include: make(map[string]struct{}), Exclude: make(map[string]struct{}), } filenameabs, _ := filepath.Abs(filename) yamlFile, err := ioutil.ReadFile(filenameabs) err = yaml.Unmarshal(yamlFile, &loadedPaths) return loadedPaths, nil}正在从文件中读取数据,但解组函数没有将任何内容放入结构中,并且没有返回任何错误。我怀疑 unmarshal-function 无法将 YAML 集合转换为map[string]struct{},但如前所述,它不会产生任何错误,而且我环顾四周寻找类似的问题,但似乎找不到任何错误。任何线索或见解将不胜感激!
1 回答
胡说叔叔
TA贡献1804条经验 获得超8个赞
通过调试,我发现了多个问题。首先,yaml似乎并不关心字段名称。您必须使用注释字段
`yaml:"NAME"`
其次,在 YAML 文件中,Include两者Exclude都只包含一个字符串列表,而不是类似于地图的东西。所以你的结构变成:
type Paths struct {
Include []string `yaml:"Include"`
Exclude []string `yaml:"Exclude"`
}
它有效。完整代码:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
var str string = `
'Include':
- 'string1'
- 'string2'
'Exclude':
- 'string3'
- 'string4'
`
type Paths struct {
Include []string `yaml:"Include"`
Exclude []string `yaml:"Exclude"`
}
func main() {
paths := Paths{}
err := yaml.Unmarshal([]byte(str), &paths)
fmt.Printf("%v\n", err)
fmt.Printf("%+v\n", paths)
}
- 1 回答
- 0 关注
- 161 浏览
添加回答
举报
0/150
提交
取消