【Go學習筆記15】解析yaml

zhongzhong05發表於2018-01-04

【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]]
複製程式碼

相關文章