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

在 Go 中保留 YAML 文件中的顺序

在 Go 中保留 YAML 文件中的顺序

Go
呼如林 2023-01-03 17:23:47
我正在尝试读取如下所示的 YAML 文件中的数据:Category Name:  Task 1:    Name: Meeting    PM: 1    TC: 0    STC: 1    Optional: false一个类别中可以有多个任务,也可以有多个类别。我最初是这样阅读 YAML 文件的。type Task struct {    Name     string    PM       string    TC       string    STC      string    Optional bool}type Category struct {    Name  string    Tasks []Task}func parseFile() map[string]map[string]map[string]string {    file, err := ioutil.ReadFile("config.yaml")    if err != nil {        log.Fatal(err)    }    data := make(map[string]map[string]map[string]string)    err1 := yaml.Unmarshal(file, &data)    if err1 != nil {        log.Fatal(err1)    }    return data}然后我只有一个函数来循环遍历在 parseFile() 中创建的地图,并创建一个包含填充信息的类别列表。这很好用……除了由于地图未排序而未保留 YAML 文件中写入的类别/任务的顺序之外。通过在线阅读,我发现您可以使用来自 gokpg.in/yaml.v2 的 yaml.MapSlice{} 来保留顺序。但是,我不知道如何处理生成的 MapSlice。我可以遍历它以获取类别,但我无法遍历 .Value,因为 MapItems 是接口,但 MapItems 会存储我的任务列表。我该怎么做才能获得任务并放入 []Task?感谢帮助 :)
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我设法通过更改我的 YAML 和结构的格式来解决这个问题,然后直接解组到结构中。


新的结构。


type Categories struct {

    Category []struct {

        Name string `yaml:"CategoryName"`

        Task []struct {

            Name     string  `yaml:"TaskName"`

            PM       float64 `yaml:"PM"`

            TC       float64 `yaml:"TC"`

            STC      float64 `yaml:"STC"`

            Optional bool    `yaml:"Optional"`

        } `yaml:"Tasks"`

    } `yaml:"Categories"`

}

YAML 文件的新格式以支持结构中的内容。


Categories:

  - CategoryName: Category 1

    Tasks:

      - TaskName: Test 1

        PM: 1

        TC: 0

        STC: 1

        Optional: false

      - TaskName: Test 2

        PM: 2

        TC: 0

        STC: 2

        Optional: false

  - CategoryName: Category 2

    Tasks:

      - TaskName: Test 3

        PM: 1

        TC: 2

        STC: 3

        Optional: true

将 YAML 文件直接解组为新结构


var tasks Categories

    file, err := ioutil.ReadFile("config.yaml")


    if err != nil {

        log.Fatal(err)

    }


    yaml.Unmarshal(file, &tasks)

这解决了我的问题 - 不再使用地图以便保留顺序并以我发现易于循环的方式使用结构。


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

添加回答

举报

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