【Go學習筆記15】解析yaml
在專案中,難免會用到配置檔案,目前來說,yaml格式的配置檔案應該是最流行的,那麼在Go中如何來解析yaml配置檔案呢。
解析yaml檔案
假設我們現在有一個config.dev.yaml的配置檔案,裡面的內容如下:
version: 0.0.1
複製程式碼
那麼我們可以像下面這樣來解析:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
type Config struct {
Version string `yaml:"version"`
}
func main() {
t := Config{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf(t.Version)
}
複製程式碼
上面的程式碼中,首先定義了一個自定義型別Config,這個型別和yaml中的屬性配置了對映,這樣在後面解析的時候就可以將值設定到對應的屬性上。在main方法中,首先通過ioutil的ReadFile方法來讀取配置檔案的資料,然後再呼叫yaml的Unmarshal方法來解析資料到物件t中,注意這裡必須傳遞t的地址(&t),這種形式,否則會報錯。
解析巢狀的yaml
上面的例子只是解析了最簡單的,沒有巢狀結果的yaml配置檔案,但是在實際的開發過程中,巢狀的yaml配置檔案經常出現。下面來看下如何解析巢狀的yaml配置檔案。
假設我們有一個config.dev.yaml的檔案,內容如下:
version: 0.0.1
author:
name: zhongzhong
age: 25
複製程式碼
那麼我們可以使用下面的程式碼來解析:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
type Config struct {
Version string `yaml:"version"`
Author struct {
Name string `yaml:"name"`
Age int `yaml:"age"`
}
}
func main() {
t := Config{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("%v",t)
}
複製程式碼
輸出結果:
{0.0.1 {zhongzhong 25}}
複製程式碼
將yaml配置內容解析到map物件中
上面的例子,我們都需要定義一個自定義型別,然後還需要配置對映,有時候感覺會很麻煩,那麼我們就可以將yaml解析到一個map物件中。
還是上面的配置內容,可以使用 下面的程式碼來將內容解析到一個map物件中:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
"io/ioutil"
)
func main() {
t := map[string]interface{}{}
buffer, err := ioutil.ReadFile("./config.dev.yaml")
err = yaml.Unmarshal(buffer, &t)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("%v",t)
}
複製程式碼
輸出結果:
map[version:0.0.1 author:map[name:zhongzhong age:25]]
複製程式碼