我试图将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函数没有在结构中添加任何内容,并且没有返回任何错误。
我怀疑unmarshal功能无法将YAML集合转换为map[string]struct{}
,但正如所提到的那样,它没有产生任何错误,而且我已经四处寻找类似的问题而且似乎无法找到任何。
非常感谢任何线索或见解!
答案 0 :(得分:0)
通过调试我发现了多个问题。首先,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)
}