使用地图将YAML Unmarshal解构为struct

时间:2016-08-27 02:47:49

标签: go 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函数没有在结构中添加任何内容,并且没有返回任何错误。

我怀疑unmarshal功能无法将YAML集合转换为map[string]struct{},但正如所提到的那样,它没有产生任何错误,而且我已经四处寻找类似的问题而且似乎无法找到任何。

非常感谢任何线索或见解!

1 个答案:

答案 0 :(得分:0)

通过调试我发现了多个问题。首先,yaml似乎并不关心字段名称。您 使用

注释字段
`yaml:"NAME"`

其次,在YAML文件中,IncludeExclude都只包含字符串列表,而不是类似于地图的字符串。所以你的结构变成了:

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)
}