golang下的viper包的簡單使用方式
golang下viper包的簡單使用
Viper 是一個(gè)完整的 Go 應(yīng)用程序配置解決方案,它旨在在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式
使用viper并不復(fù)雜,在不生成實(shí)例的情況下,viper使用默認(rèn)的實(shí)例才緩存配置信息,如果你不想這么做,可以使用viper.New()方法來生成自己的實(shí)例,直接上代碼
package main
import (
"bytes"
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
/**
viper.SetDefault會(huì)設(shè)置默認(rèn)參數(shù),也就是說,每次讀取文件后,這些參數(shù)都會(huì)讀取到viper的緩存中,
并且在使用viper提供的方法寫文件時(shí),也會(huì)一同寫進(jìn)去,當(dāng)使用Set方法后,默認(rèn)值將會(huì)被覆蓋
**/
viper.SetConfigName("config") // 這里設(shè)置要讀取文件的名稱
viper.SetConfigType("yaml") // 這里設(shè)置要讀取文件的類型
viper.AddConfigPath(".") // 這里設(shè)置讀取文件的文件夾路徑,可以設(shè)置多個(gè)路徑,將會(huì)依次從這幾個(gè)路徑中去尋找config.yaml文件
viper.AddConfigPath("./test3") // 設(shè)置的第二個(gè)備選路徑
viper.AddConfigPath("./test") // 設(shè)置的最后一個(gè)備選路徑
err := viper.ReadInConfig() // ReadInConfig用于讀取查找到的配置文件
if err != nil {
panic(fmt.Errorf("fatal error config file: %w", err)) // 返回失敗信息,可能由于文件不存在等
}
viper.Set("newconf", true) // 設(shè)置新參數(shù),上面講述了Set和SetDefault的區(qū)別,這里不再贅述
viper.WriteConfig()
viper.SafeWriteConfig()
viper.WriteConfigAs("./test2/config.yaml")
viper.SafeWriteConfigAs("./test2/config.yaml")
/**
WriteConfig用于將配置信息寫入新的配置文件中,新文件的名稱和后綴采用使用第20,21行所設(shè)置的SetConfigName("config")
和viper.SetConfigType("yaml")。WriteConfigAs可以指定新的配置文件的路徑(帶有文件名的路徑),
而WriteConfig則寫入你所定義的第一個(gè)AddConfigPath,即第22行:“ viper.AddConfigPath(".") ”
方法名帶有Safe的則代表如果文件已經(jīng)存在,則會(huì)報(bào)錯(cuò)。不帶有Safe的方法在文件已經(jīng)存在時(shí)會(huì)覆蓋文件。
這里將會(huì)把第11,12,13行和第31行設(shè)置的參數(shù)連同config.yaml文件原本的參數(shù)一同寫入到新文件中
**/
var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
viper.SetConfigType("yaml")
viper.ReadConfig(bytes.NewBuffer(yamlExample))
x := viper.GetString("name")
y := viper.Get("name")
fmt.Println(x)
fmt.Println(y)
/**
除了從文件中讀取配置信息以外,也可以從字節(jié)流中讀取,如上所示,GetString方法返回key所對(duì)應(yīng)的字符串類型的value,
同樣你也可以使用GetInt,GetBool等等,Get方法返回一個(gè)接口,因此它可以適用于所有的類型。
**/
viper.RegisterAlias("loud", "Verbose")
viper.Set("verbose", true)
viper.Set("loud", true)
viper.GetBool("loud")
viper.GetBool("verbose")
/**
RegisterAlias用于注冊(cè)別名,也就意味著你接下來的所有關(guān)于loud的操作都可以用vervose來代替,
但他只作為你程序運(yùn)行過程中一個(gè)方便使用的別名,其所表達(dá)的配置信息中不含有verbose這一屬性,
也就是說最終你寫入新配置文件時(shí),verbose將不會(huì)出現(xiàn)
最后注意!?。。涸趘aper中,配置信息的key是不區(qū)分大小寫的,因此上方的Verbose和verbose等同
**/
viper.AutomaticEnv()
// 讀取環(huán)境變量
viper.SetEnvPrefix("CGO")
/** 設(shè)置環(huán)境變量前綴:CGO_,如果是cgo,將自動(dòng)轉(zhuǎn)變?yōu)榇髮憽?
這樣在使用get讀取環(huán)境變量時(shí)可以只讀取與項(xiàng)目有關(guān)的配置
**/
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
// 將viper.Get(key) key字符串中'.'和'-'替換為'_',
// 這使得使用Get獲取值的時(shí)候可以使用其他符號(hào)來代替_
viper.BindEnv("ENABLED") // 將"CGO_ENABLED"綁定到"ENABLED"
viper.BindEnv("enabled") // 匹配環(huán)境變量時(shí)自動(dòng)轉(zhuǎn)換為大寫,但key仍然是小寫
viper.BindEnv("user.secret-id", "GOROOT") // 當(dāng)含有兩個(gè)參數(shù)時(shí),前綴不會(huì)生效
viper.BindEnv("PATH", "PATH")
fmt.Println(viper.Get("user.secret-id"))
fmt.Println(viper.GetString("ENABLED"))
fmt.Println(viper.GetString("enabled"))
fmt.Println(viper.GetString("PATH"))
// viper在讀取環(huán)境變量時(shí)是區(qū)分大小寫的
}golang常用庫viper解讀
1. viper的介紹
viper是go一個(gè)配置解決方案的庫。
- 支持各種配置文件,如JSON,TOML, YAML, HCL, envfile和Java屬性配置文件
- 支持監(jiān)聽文件變化以及重新讀取配置
- 支持從環(huán)境變量讀取配置
- 支持從遠(yuǎn)程配置系統(tǒng)(etcd或Consul)讀取配置,并能監(jiān)聽遠(yuǎn)程配置修改
- 支持從命令行標(biāo)志Flag讀取配置,比如搭配cobra使用
viepr直接使用go get命令安裝即可
$ go get github.com/spf13/viper
2.viper的使用
//加載本地配置
func InitInFromLocal() (*viper.Viper, error) {
home := "./config"
var v = viper.New()
//cobra.CheckErr(err)
fmt.Printf("UserHomeDir", home)
// Search config in home directory with name ".cobra" (without extension).
v.AddConfigPath(home)
v.SetConfigType("toml")
v.SetConfigName("pro")
v.AutomaticEnv()
if err := v.ReadInConfig(); err == nil {
fmt.Println("Using config file success:", v.ConfigFileUsed())
} else {
fmt.Println("Using config file:%s", err)
}
fmt.Println(v.GetString("app_name_pro"))
return v, nil
}
//加載遠(yuǎn)端配置
func InitConfigFromRemote() error {
// 遠(yuǎn)程配置
viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "config/app.yml")
//v.SetConfigType("json")
viper.SetConfigFile("app.yml")
viper.SetConfigType("yml")
if err := viper.ReadRemoteConfig(); err == nil {
log.Printf("use config file -> %s\n", viper.ConfigFileUsed())
} else {
return err
}
return nil
}
//設(shè)置默認(rèn)值
viper.SetDefault("email", "NAME HERE <EMAIL ADDRESS>")
viper.SetDefault("license", "apache")
//綁定單個(gè)值cobra
viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
//綁定多個(gè)值
viper.BindPFlags(rootCmd.PersistentFlags())
//獲取環(huán)境變量
v.AutomaticEnv()
v.AllowEmptyEnv(true)
v.SetEnvPrefix("CK")
//監(jiān)聽文件變化
// 監(jiān)聽到文件變化后的回調(diào)
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
fmt.Println(v.Get("db.redis.passwd"))
})
v.WatchConfig()
//從viper寫入文件
viper.SetConfigFile("./hello.yml")
viper.WriteConfig()
//獲取子配置項(xiàng)
viper.Sub("db")總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
超實(shí)用的Golang通道指南之輕松實(shí)現(xiàn)并發(fā)編程
Golang?中的通道是一種高效、安全、靈活的并發(fā)機(jī)制,用于在并發(fā)環(huán)境下實(shí)現(xiàn)數(shù)據(jù)的同步和傳遞。本文主要介紹了如何利用通道輕松實(shí)現(xiàn)并發(fā)編程,需要的可以參考一下2023-04-04
golang中http請(qǐng)求的context傳遞到異步任務(wù)的坑及解決
這篇文章主要介紹了golang中http請(qǐng)求的context傳遞到異步任務(wù)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
四種Golang實(shí)現(xiàn)middleware框架的方式小結(jié)
middleware是一般框架里面常用的形式,比如web框架、rpc框架等,本文為大家詳細(xì)介紹了四種實(shí)現(xiàn)middleawre的方式,感興趣的可以了解一下2024-03-03
Golang 錯(cuò)誤捕獲Panic與Recover的使用
對(duì)于Go語言的錯(cuò)誤是通過返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

