golang下的viper包的簡單使用方式
更新時間:2023年06月12日 09:56:22 作者:imthefaker
這篇文章主要介紹了golang下的viper包的簡單使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
golang下viper包的簡單使用
Viper 是一個完整的 Go 應(yīng)用程序配置解決方案,它旨在在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式
使用viper并不復雜,在不生成實例的情況下,viper使用默認的實例才緩存配置信息,如果你不想這么做,可以使用viper.New()方法來生成自己的實例,直接上代碼
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會設(shè)置默認參數(shù),也就是說,每次讀取文件后,這些參數(shù)都會讀取到viper的緩存中, 并且在使用viper提供的方法寫文件時,也會一同寫進去,當使用Set方法后,默認值將會被覆蓋 **/ viper.SetConfigName("config") // 這里設(shè)置要讀取文件的名稱 viper.SetConfigType("yaml") // 這里設(shè)置要讀取文件的類型 viper.AddConfigPath(".") // 這里設(shè)置讀取文件的文件夾路徑,可以設(shè)置多個路徑,將會依次從這幾個路徑中去尋找config.yaml文件 viper.AddConfigPath("./test3") // 設(shè)置的第二個備選路徑 viper.AddConfigPath("./test") // 設(shè)置的最后一個備選路徑 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則寫入你所定義的第一個AddConfigPath,即第22行:“ viper.AddConfigPath(".") ” 方法名帶有Safe的則代表如果文件已經(jīng)存在,則會報錯。不帶有Safe的方法在文件已經(jīng)存在時會覆蓋文件。 這里將會把第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所對應(yīng)的字符串類型的value, 同樣你也可以使用GetInt,GetBool等等,Get方法返回一個接口,因此它可以適用于所有的類型。 **/ viper.RegisterAlias("loud", "Verbose") viper.Set("verbose", true) viper.Set("loud", true) viper.GetBool("loud") viper.GetBool("verbose") /** RegisterAlias用于注冊別名,也就意味著你接下來的所有關(guān)于loud的操作都可以用vervose來代替, 但他只作為你程序運行過程中一個方便使用的別名,其所表達的配置信息中不含有verbose這一屬性, 也就是說最終你寫入新配置文件時,verbose將不會出現(xiàn) 最后注意?。。。涸趘aper中,配置信息的key是不區(qū)分大小寫的,因此上方的Verbose和verbose等同 **/ viper.AutomaticEnv() // 讀取環(huán)境變量 viper.SetEnvPrefix("CGO") /** 設(shè)置環(huán)境變量前綴:CGO_,如果是cgo,將自動轉(zhuǎn)變?yōu)榇髮憽? 這樣在使用get讀取環(huán)境變量時可以只讀取與項目有關(guān)的配置 **/ viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) // 將viper.Get(key) key字符串中'.'和'-'替換為'_', // 這使得使用Get獲取值的時候可以使用其他符號來代替_ viper.BindEnv("ENABLED") // 將"CGO_ENABLED"綁定到"ENABLED" viper.BindEnv("enabled") // 匹配環(huán)境變量時自動轉(zhuǎn)換為大寫,但key仍然是小寫 viper.BindEnv("user.secret-id", "GOROOT") // 當含有兩個參數(shù)時,前綴不會生效 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)境變量時是區(qū)分大小寫的 }
golang常用庫viper解讀
1. viper的介紹
viper是go一個配置解決方案的庫。
- 支持各種配置文件,如JSON,TOML, YAML, HCL, envfile和Java屬性配置文件
- 支持監(jiān)聽文件變化以及重新讀取配置
- 支持從環(huán)境變量讀取配置
- 支持從遠程配置系統(tǒng)(etcd或Consul)讀取配置,并能監(jiān)聽遠程配置修改
- 支持從命令行標志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 } //加載遠端配置 func InitConfigFromRemote() error { // 遠程配置 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è)置默認值 viper.SetDefault("email", "NAME HERE <EMAIL ADDRESS>") viper.SetDefault("license", "apache") //綁定單個值cobra viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) //綁定多個值 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() //獲取子配置項 viper.Sub("db")
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
golang?gorm框架數(shù)據(jù)庫的連接操作示例
這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決
這篇文章主要為大家介紹了goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11