Go語言讀取YAML 配置文件的兩種方式分享

前言

在日常開發中,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 → %+v\n", 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 配置文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: