Go語言讀取YAML 配置文件的兩種方式分享
前言
在日常開發(fā)中,YAML 格式的文件基本上被默認為是配置文件,其內(nèi)容因為縮進帶來的層級感看起來非常直觀和整潔。本文將會對 YAML 內(nèi)容的讀取進行介紹。
yaml.v3 包
yaml.v3 的包,可以讓我們在 Go 里面輕松地操作 yaml 格式的數(shù)據(jù)(如將 yaml 格式轉(zhuǎn)成結構體等)。在使用 yaml.v3 包之前,我們需要先安裝它:
go get gopkg.in/yaml.v3
讀取 yaml 文件
yaml 測試文件內(nèi)容:
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379
將 yaml 文件的數(shù)據(jù)轉(zhuǎn)成自定義的結構體或 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èi)容: \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}}
}執(zhí)行結果:
yaml 文件的內(nèi)容:
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函數(shù)讀取文件的內(nèi)容,獲取[]byte類型的數(shù)據(jù); - 通過
yaml包的Unmarshal(in []byte, out interface{})函數(shù)將字節(jié)數(shù)組類型的數(shù)據(jù)解析到Config結構體變量里,Unmarshal 函數(shù)需要傳遞兩個參數(shù),第一個是 字節(jié)數(shù)組類型的數(shù)據(jù),第二個是一個任意類型的數(shù)據(jù),實際上要傳入一個指針變量,或者某個變量的地址值; - 通過打印結果可以看到 yaml 文件的內(nèi)容已經(jīng)成功解析到結構體
config和mp變量里了,后續(xù)可以通過操作結構體和map獲取對應數(shù)據(jù)。
viper 包
viper 包可以幫助我們做很多東西,比如讀取 json、yaml、properties 等配置文件,讀取環(huán)境變量、讀取命令行參數(shù)等。在使用 viper 包之前,我們需要先安裝它:
go get github.com/spf13/viper
讀取 yaml 文件
yaml 測試文件內(nèi)容:
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 函數(shù),指定配置文件的名稱;
通過 SetConfigType 函數(shù),指定配置文件的類型;
通過 AddConfigPath 函數(shù),指定配置文件所在目錄,可以多次調(diào)用此函數(shù),指定多個目錄;
通過 ReadInConfig 函數(shù),尋找配置文件并讀取,操作的過程中可能會發(fā)生錯誤,如配置文件沒找到,配置文件的內(nèi)容格式不正確等;
讀取文件成功之后,可以通過 Get 函數(shù),通過指定 key 獲取對應的 value。
小結
本文介紹了讀取 YAML 配置文件的兩種方式,第一種是通過 yaml.v3 包,第二種是通過 viper 包。如果是在項目里解析配置文件,推薦使用 viper 包,它支持解析多種格式的配置文件,監(jiān)聽配置文件的更新,修改配置文件等。
到此這篇關于Go語言讀取YAML 配置文件的兩種方式分享的文章就介紹到這了,更多相關Go讀取YAML 配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang中類型轉(zhuǎn)換利器cast庫的用法詳解
cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應用吧2024-11-11
Go實現(xiàn)將io.Writer轉(zhuǎn)換成字符串
golang中提供了各種類型之間的轉(zhuǎn)換方法,其中,將其他類型轉(zhuǎn)換為字符串類型是常見的操作,本文主要介紹了Go實現(xiàn)將io.Writer轉(zhuǎn)換成字符串,具有一定的參考價值,感興趣的可以了解一下2024-05-05

