1. 程式人生 > >Go語言解析YAML

Go語言解析YAML

gopath從零學
要用go,用官方的安裝包安裝在Home目錄下還需要額外的配置
首先安裝完go,在資料夾的bin目錄下執行go的命令報錯:
go: cannot find GOROOT directory: /usr/local/go
需要在~/.bashrc中修改為安裝go的地址:
vim ~/.bashrc
插入:
export GOROOT=/home/test/go
PATH=PATH:GOROOT/bin
GOROOT主要是指明go安裝包的位置,因為裡頭有go編譯需要的庫檔案等
下面在/home/test/src中寫一個helloworld.go:

package main
import
"fmt" func main() { fmt.Println("hello world") }

然後使用go run:
go run helloworld.go

然後按專案的要求,需要用go語言讀取yaml檔案。
首先從github上下載解析yaml的原始碼包,如果有網的話可以直接使用go get gopkg.in/yaml.v2
但是我們的編譯機都是不聯網的,所以只能從https://github.com/go-yaml/yaml 下載原始碼,解壓開來是一個yaml-2的資料夾
我們把yaml-2資料夾放在/home/test/目錄下
在helloword.go中加入一行:
import “../yaml-2”
然後就可以使用yaml-2中定義的若干函數了
實際使用時,參考的以下文章:

http://blog.csdn.net/wm5920/article/details/77198153
一個Load一個Marshel就可以將文字轉換成一個大的結構體

在上文的例子中,可以看到程式碼中使用了一個劃定好內容的結構體MyConf{}
但實際使用中發現這種結構體的形式無法滿足我們的要求,比如我們的yml模板,很多會變化的,比如以rancher的模板為例:

    m := make(map[interface{}]interface{})
    if err != nil {
        fmt.Sprintln("error: %v", err)
    }
    err = yaml.Unmarshal([]byte
(data), &m) fmt.Println(m)

按照Map直接讀取yml檔案的全部內容,程式碼中可以對每一層的map進行處理,每一層都是一個map。這樣就不用考慮設計的結構體是否能滿足千變萬化的yaml配置檔案。