Golang工具庫(kù)viper的使用教程
viper 是 go 項(xiàng)目中用來(lái)讀取配置文件的庫(kù),支持讀取 yaml、toml、json、hcl、env 等格式的配置文件
讀取環(huán)境變量
viper 可以讀取終端的環(huán)境變量
如果你用的是 zsh 在 ~/.zshrc 中設(shè)置,如果是 bash 在 ~/.bashrc 中設(shè)置
寫(xiě)環(huán)境變量時(shí),等號(hào)兩邊不能有空格,否則會(huì)報(bào)錯(cuò)
export APP_DEBUG=true
寫(xiě)好后,記得 source 一下,或者重啟終端
source ~/.zshrc
使用 viper.AutomaticEnv 將環(huán)境變量都讀取到 viper 中
然后就可以使用 viper.GetBool("APP_DEBUG") 來(lái)獲取環(huán)境變量了
func GetEnvInfo(env string) bool {
viper.AutomaticEnv()
return viper.GetBool(env)
}
app_debug := GetEnvInfo("APP_DEBUG")
fmt.Println(app_debug) // true讀取本地的配置文件
新建一個(gè) config-debug.yaml 文件,內(nèi)容如下:
host: "127.0.0.1" port: 50051
然后使用 viper 讀取,setConfigFile 填寫(xiě)的路徑是相對(duì)于 main.go 的路徑
使用 viper.ReadInConfig 來(lái)讀取配置文件
viper.SetConfigFile("./config-debug.yaml")
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
fmt.Println(viper.GetString("host")) // "127.0.0.1"使用 viper.SetConfigName 來(lái)設(shè)置文件名,viper.SetConfigType 來(lái)設(shè)置文件類(lèi)型,可以更靈活的讀取配置文件
viper.SetConfigName設(shè)置文件名,不需要帶后綴viper.SetConfigType設(shè)置文件類(lèi)型viper.AddConfigPath設(shè)置文件路徑
viper.SetConfigName("config-debug")
viper.SetConfigType("yaml")
viper.AddConfigPath("./")
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
fmt.Println(viper.GetString("host")) // "127.0.0.1"將配置文件中的配置映射到結(jié)構(gòu)體中
每次使用 viper.GetString 來(lái)獲取配置文件中的配置,都會(huì)寫(xiě)很多重復(fù)的代碼,可以將配置文件中的配置映射到結(jié)構(gòu)體中
新建結(jié)構(gòu)體,結(jié)構(gòu)體的字段名要和配置文件中的字段名一致,使用 mapstructure 標(biāo)簽來(lái)映射
type Server struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
}使用 viper.Unmarshal 將配置文件中的配置映射到結(jié)構(gòu)體中
var server Server
viper.SetConfigName("config-debug")
viper.SetConfigType("yaml")
viper.AddConfigPath("./")
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
if err := viper.Unmarshal(&server); err != nil {
panic(err)
}
fmt.Println(server.Host) // "127.0.0.1"監(jiān)聽(tīng)配置信息的變化
如果配置文件發(fā)生變化,viper 支持在運(yùn)行時(shí)監(jiān)聽(tīng)配置文件的變化
使用 viper.WatchConfig 來(lái)監(jiān)聽(tīng)配置文件的變化,使用 viper.OnConfigChange 來(lái)監(jiān)聽(tīng)配置文件的變化
onConfigChange 傳入的參數(shù)是一個(gè)函數(shù),函數(shù)的參數(shù)是 fsnotify.Event,在函數(shù)中重新讀取配置文件,然后將配置文件中的配置映射到結(jié)構(gòu)體中
viper.OnConfigChange(func(e fsnotify.Event) {
_ = viper.ReadInConfig()
_ = viper.Unmarshal(&server)
})
viper.WatchConfig()到此這篇關(guān)于Golang工具庫(kù)viper的使用教程的文章就介紹到這了,更多相關(guān)Golang viper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go實(shí)現(xiàn)redigo的簡(jiǎn)單操作
golang操作redis主要有兩個(gè)庫(kù),go-redis和redigo,今天我們就一起來(lái)介紹一下redigo的實(shí)現(xiàn)方法,需要的朋友可以參考下2018-07-07
Go-RESTful實(shí)現(xiàn)下載功能思路詳解
這篇文章主要介紹了Go-RESTful實(shí)現(xiàn)下載功能,文件下載包括文件系統(tǒng)IO和網(wǎng)絡(luò)IO,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄
這篇文章主要介紹了詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Go語(yǔ)言轉(zhuǎn)化php數(shù)組的示例代碼
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何實(shí)現(xiàn)轉(zhuǎn)化php數(shù)組的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)GO語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11
Golang開(kāi)發(fā)gRPC服務(wù)入門(mén)介紹
這篇文章主要介紹了Golang開(kāi)發(fā)gRPC服務(wù),Golang開(kāi)發(fā)gRPC應(yīng)用程序的套路也已經(jīng)很清晰,這篇文章就來(lái)做一個(gè)簡(jiǎn)單的介紹,算是入門(mén),需要的朋友可以參考下2022-04-04
go mutex互斥鎖使用Lock和Unlock方法占有釋放資源
Go號(hào)稱(chēng)是為了高并發(fā)而生的,在高并發(fā)場(chǎng)景下,勢(shì)必會(huì)涉及到對(duì)公共資源的競(jìng)爭(zhēng),當(dāng)對(duì)應(yīng)場(chǎng)景發(fā)生時(shí),我們經(jīng)常會(huì)使用 mutex 的 Lock() 和 Unlock() 方法來(lái)占有或釋放資源,雖然調(diào)用簡(jiǎn)單,但 mutex 的內(nèi)部卻涉及挺多的,本文來(lái)好好研究一下2023-09-09

