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

我正在尝试读取如下所示的 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?


感谢帮助 :)


呼如林
浏览 224回答 1
1回答

斯蒂芬大帝

我设法通过更改我的 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)这解决了我的问题 - 不再使用地图以便保留顺序并以我发现易于循环的方式使用结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go