亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號