为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
有只小跳蛙 2022-03-03 19:53:19
我正在尝试将 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)

}


查看完整回答
反对 回复 2022-03-03
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信