首頁 > 軟體

Golang解析yaml檔案操作指南

2022-09-08 18:04:35

前言

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 依賴:

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

第二步,建立 main 檔案並在內部編寫一個簡單的結構體:

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 檔案去編寫我們的設定:

a: 1
b: "I am B"
c: true
d:
  - "I"
  - "am"
  - "D"
e:
  ea: "I am EA"
  eb: "I am EB"

第四步,編寫 main 函數:

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("%#vn", confDemo)
  fmt.Printf("%sn", yml)
}

第五步,執行並檢視結果:

➜  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 中展現的 MarshallUnmarshall 方法,他們會直接在結構體和位元組流上進行操作。但有時我們為了圖方便想把讀取位元組流這一步也交給元件去執行,這時候我們可以利用 yaml.Encoderyaml.Decoder

yaml.Encoderyaml.Decoderio.Writerio.Reader 上進行操作讀取其位元組流並執行編碼和解碼的動作。我們將上面的例子以這種方法再次實現一遍:

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("%#vn", 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)
	}
}

執行結果:

➜  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檔案操作的文章就介紹到這了,更多相關Golang解析yaml檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com