使用地图将 YAML 解组到结构中

我正在尝试将 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{},但如前所述,它不会产生任何错误,而且我环顾四周寻找类似的问题,但似乎找不到任何错误。


任何线索或见解将不胜感激!


有只小跳蛙
浏览 162回答 1
1回答

胡说叔叔

通过调试,我发现了多个问题。首先,yaml似乎并不关心字段名称。您必须使用注释字段`yaml:"NAME"`其次,在 YAML 文件中,Include两者Exclude都只包含一个字符串列表,而不是类似于地图的东西。所以你的结构变成:type Paths struct {    Include []string `yaml:"Include"`    Exclude []string `yaml:"Exclude"`}它有效。完整代码:package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go