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: 3306redis:
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 文件的內容已經成功解析到結構體
config
和mp
變量裡瞭,後續可以通過操作結構體和map
獲取對應數據。
viper 包
viper
包可以幫助我們做很多東西,比如讀取 json
、yaml
、properties
等配置文件,讀取環境變量、讀取命令行參數等。在使用 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!
推薦閱讀:
- golang讀取各種配置文件(ini、json、yaml)
- go項目中環境變量的配置
- Go 多環境下配置管理方案(多種方案)
- go語言Pflag Viper Cobra 核心功能使用介紹
- go學習筆記讀取consul配置文件詳解