jlzzjlzz亚洲乱熟在线播放

系統城裝機大師 - 固鎮縣祥瑞電腦科技銷售部宣傳站!

當前位置:首頁 > 腳本中心 > 其它 > 詳細頁面

Golang解析yaml文件操作指南

時間:2022-09-12來源:www.farandoo.com作者:電腦系統城

前言

yaml 文件是研發人員最常用的配置文件,yaml 文件的樹形結構一直很受大家的歡迎。有過 SpringBoot 開發經驗的同學對 yaml 非常熟悉,SpringBoot 整個項目的運行就需要一個 application.yaml 文件的支持,那么 Golang 項目中的 yaml 文件是如何解析的呢?Let`s dive in!

PS:根據 godocs 的說法,Golang 有三個強大的工具包支持 yaml 文件的解析,分別是:go-gypsy go-yaml goccy-yaml。本文中我們將討論其中 go-yaml 的用法。

對 yaml 解析源碼感興趣的同學請進入:go-yaml源碼鏈接

Simple Demo

第一步,我們創建好項目后導入 go-yaml 依賴:

1
2
go-yaml go get gopkg.in/yaml.v3
go: added gopkg.in/yaml.v3 v3.0.1

第二步,創建 main 文件并在內部編寫一個簡單的結構體:

1
2
3
4
5
6
7
8
9
10
11
type ConfDemo struct {
  // 后面的 yaml 注解是在 yaml 文件中的屬性名
    A int      `yaml:"a"`
    B string   `yaml:"b"`
    C bool     `yaml:"c"`
    D []string `yaml:"d"`
    E struct {
        EA string `yaml:"ea"`
        EB string `yaml:"eb"`
    } `yaml:"e"`
}

第三步,在主目錄下創建 conf 目錄,并在 conf 目錄下創建 conf_demo.yaml 文件去編寫我們的配置:

1
2
3
4
5
6
7
8
9
10
a: 1
b: "I am B"
c: true
d:
  - "I"
  - "am"
  - "D"
e:
  ea: "I am EA"
  eb: "I am EB"

第四步,編寫 main 函數:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func main() {
  // 讀取文件所有內容裝到 []byte 中
    bytes, err := ioutil.ReadFile("config/conf_demo.yaml")
    if err != nil {
        log.Fatalln(err)
    }
  // 創建配置文件的結構體
    var confDemo ConfDemo
  // 調用 Unmarshall 去解碼文件內容
  // 注意要穿配置結構體的指針進去
    err = yaml.Unmarshal(bytes, &confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 調用 Unmarshall 對解碼出來的 confDemo 進行編碼
  // 返回的 yml 是 []byte 類型的
  yml, err := yaml.Marshal(confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 輸出結果
    fmt.Printf("%#v\n", confDemo)
  fmt.Printf("%s\n", yml)
}

第五步,運行并查看結果:

1
2
3
4
5
6
7
8
9
10
11
12
go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

go-yaml 其他解析方法

第一種解析方法即 simple Demo 中展現的 Marshall 和 Unmarshall 方法,他們會直接在結構體和字節流上進行操作。但有時我們為了圖方便想把讀取字節流這一步也交給組件去執行,這時候我們可以利用 yaml.Encoder 和 yaml.Decoder。

yaml.Encoder 和 yaml.Decoder 在 io.Writer 和 io.Reader 上進行操作讀取其字節流并執行編碼和解碼的動作。我們將上面的例子以這種方法再次實現一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func main() {
  // 利用 os.Open 獲取 File 對象,該對象實現了 io.Reader 和 io.Writer
    file, err := os.Open("config/conf_demo.yaml")
    if err != nil {
        log.Fatalln(err)
    }
  // 構造新的 Decoder,并傳入 file
    decoder := yaml.NewDecoder(file)
  // 配置文件結構體
    var confDemo ConfDemo
  // 解碼操作,注意要傳入地址
    err = decoder.Decode(&confDemo)
  // 輸出解碼結果
    fmt.Printf("%#v\n", confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 構造新的 Encoder,這里直接傳入了 os.Stdout,代表結果直接輸出到控制臺
    encoder := yaml.NewEncoder(os.Stdout)
  // 編碼并輸出
    err = encoder.Encode(confDemo)
    if err != nil {
        log.Fatalln(err)
    }
}

運行結果:

1
2
3
4
5
6
7
8
9
10
11
12
go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

總結

到此這篇關于Golang解析yaml文件操作的文章就介紹到這了

分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載