首頁 > 軟體

Go語言讀取YAML 組態檔的兩種方式分享

2022-12-19 14:01:19

前言

在日常開發中,YAML 格式的檔案基本上被預設為是組態檔,其內容因為縮排帶來的層級感看起來非常直觀和整潔。本文將會對 YAML 內容的讀取進行介紹。

yaml.v3 包

yaml.v3 的包,可以讓我們在 Go 裡面輕鬆地操作 yaml 格式的資料(如將 yaml 格式轉成結構體等)。在使用 yaml.v3 包之前,我們需要先安裝它:

go get gopkg.in/yaml.v3

讀取 yaml 檔案

yaml 測試檔案內容:

mysql:
  url: 127.0.0.1
  port: 3306

redis:
  host: 127.0.0.1
  port: 6379

yaml 檔案的資料轉成自定義的結構體或 Map

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Mysql Mysql `json:"mysql"`
	Redis Redis `json:"redis"`
}

type Mysql struct {
	Url  string
	Port int
}

type Redis struct {
	Host string
	Port int
}

func main() {
	dataBytes, err := os.ReadFile("test.yaml")
	if err != nil {
		fmt.Println("讀取檔案失敗:", err)
		return
	}
	fmt.Println("yaml 檔案的內容: n", string(dataBytes))
	config := Config{}
	err = yaml.Unmarshal(dataBytes, &config)
	if err != nil {
		fmt.Println("解析 yaml 檔案失敗:", err)
		return
	}
	fmt.Printf("config → %+vn", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}

	mp := make(map[string]any, 2)
	err = yaml.Unmarshal(dataBytes, mp)
	if err != nil {
		fmt.Println("解析 yaml 檔案失敗:", err)
		return
	}
	fmt.Printf("map → %+v", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}

}

執行結果:

yaml 檔案的內容:
 mysql:
  url: 127.0.0.1
  port: 3306

redis:
  host: 127.0.0.1
  port: 6379
config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
map → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}

  • 首先通過 os 包裡的 ReadFile 函數讀取檔案的內容,獲取 []byte 型別的資料;
  • 通過 yaml 包的 Unmarshal(in []byte, out interface{}) 函數將位元組陣列型別的資料解析到 Config 結構體變數裡,Unmarshal 函數需要傳遞兩個引數,第一個是 位元組陣列型別的資料,第二個是一個任意型別的資料,實際上要傳入一個指標變數,或者某個變數的地址值;
  • 通過列印結果可以看到 yaml 檔案的內容已經成功解析到結構體 configmp 變數裡了,後續可以通過操作結構體和 map 獲取對應資料。

viper 包

viper 包可以幫助我們做很多東西,比如讀取 jsonyamlproperties 等組態檔,讀取環境變數、讀取命令列引數等。在使用 viper 包之前,我們需要先安裝它:

go get github.com/spf13/viper

讀取 yaml 檔案

yaml 測試檔案內容:

mysql:
  url: 127.0.0.1
  port: 3306

redis:
  host: 127.0.0.1
  port: 6379

程式碼範例:

import (
    "fmt"
    "github.com/spf13/viper"
)

func main() {
    // 設定組態檔的名字
    viper.SetConfigName("test")
    // 設定組態檔的型別
    viper.SetConfigType("yaml")
    // 新增組態檔的路徑,指定 config 目錄下尋找
    viper.AddConfigPath("./config")
    // 尋找組態檔並讀取
    err := viper.ReadInConfig()
    if err != nil {
            panic(fmt.Errorf("fatal error config file: %w", err))
    }
    fmt.Println(viper.Get("mysql"))     // map[port:3306 url:127.0.0.1]
    fmt.Println(viper.Get("mysql.url")) // 127.0.0.1
}

通過 SetConfigName 函數,指定組態檔的名稱;

通過 SetConfigType 函數,指定組態檔的型別;

通過 AddConfigPath 函數,指定組態檔所在目錄,可以多次呼叫此函數,指定多個目錄;

通過 ReadInConfig 函數,尋找組態檔並讀取,操作的過程中可能會發生錯誤,如組態檔沒找到,組態檔的內容格式不正確等;

讀取檔案成功之後,可以通過 Get 函數,通過指定 key 獲取對應的 value

小結

本文介紹了讀取 YAML 組態檔的兩種方式,第一種是通過 yaml.v3 包,第二種是通過 viper 包。如果是在專案裡解析組態檔,推薦使用 viper 包,它支援解析多種格式的組態檔,監聽組態檔的更新,修改組態檔等。

到此這篇關於Go語言讀取YAML 組態檔的兩種方式分享的文章就介紹到這了,更多相關Go讀取YAML 組態檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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