聊聊Golang中很好用的viper配置模塊
前言
viper 支持Yaml、Json、 TOML、HCL 等格式,讀取非常的方便。
安裝
go get github.com/spf13/viper
如果提示找不到golang.org/x/text/這個庫,是因為golang.org/x/text/這個庫在GitHub上托管的路徑不一致。
解決辦法:
可以從https://github.com/golang/text下載源碼下來,然后到$GOPATH/src下面創(chuàng)建golang.org/x/文件夾(已存在的忽略),把壓縮包的文件解壓到golang.org/x/文件夾之下。
然后執(zhí)行 go install -x golang.org/x/text 即可解決:
正文
初始結(jié)構(gòu)目錄如下:
準(zhǔn)備測試使用的yaml文件,注意yaml的格式十分嚴(yán)格,主要是每個冒號后面必須要有空格,數(shù)組前要加“-”號表示連續(xù)(注意減號后面也有空格),內(nèi)容如下:
TimeStamp: "2018-10-18 10:09:23" Address: "Shenzhen" Postcode: 518000 CompanyInfomation: Name: "Sunny" MarketCapitalization: 50000000 EmployeeNum: 200 Department: - "Finance" - "Design" - "Program" - "Sales" IsOpen: false
讀取yaml文件:
package main import ( "github.com/spf13/viper" "fmt" ) func main() { //讀取yaml文件 v := viper.New() //設(shè)置讀取的配置文件 v.SetConfigName("linux_config") //添加讀取的配置文件路徑 v.AddConfigPath("./config/") //windows環(huán)境下為%GOPATH,linux環(huán)境下為$GOPATH v.AddConfigPath("$GOPATH/src/") //設(shè)置配置文件類型 v.SetConfigType("yaml") if err := v.ReadInConfig();err != nil { fmt.Printf("err:%s\n",err) } fmt.Printf( ` TimeStamp:%s CompanyInfomation.Name:%s CompanyInfomation.Department:%s `, v.Get("TimeStamp"), v.Get("CompanyInfomation.Name"), v.Get("CompanyInfomation.Department"), ) /* result: TimeStamp:2018-10-18 10:09:23 CompanyInfomation.Name:Sunny CompanyInfomation.Department:[Finance Design Program Sales] */ }
也可以直接反序列化為Struct,非常的方便:
package main import ( "github.com/spf13/viper" "fmt" ) func main() { //讀取yaml文件 v := viper.New() //設(shè)置讀取的配置文件 v.SetConfigName("linux_config") //添加讀取的配置文件路徑 v.AddConfigPath("./config/") //windows環(huán)境下為%GOPATH,linux環(huán)境下為$GOPATH v.AddConfigPath("$GOPATH/src/") //設(shè)置配置文件類型 v.SetConfigType("yaml") if err := v.ReadInConfig();err != nil { fmt.Printf("err:%s\n",err) } fmt.Printf( ` TimeStamp:%s CompanyInfomation.Name:%s CompanyInfomation.Department:%s `, v.Get("TimeStamp"), v.Get("CompanyInfomation.Name"), v.Get("CompanyInfomation.Department"), ) /* result: TimeStamp:2018-10-18 10:09:23 CompanyInfomation.Name:Sunny CompanyInfomation.Department:[Finance Design Program Sales] */ //反序列化 parseYaml(v) } type CompanyInfomation struct{ Name string MarketCapitalization int64 EmployeeNum int64 Department []interface{} IsOpen bool } type YamlSetting struct{ TimeStamp string Address string Postcode int64 CompanyInfomation CompanyInfomation } func parseYaml(v *viper.Viper){ var yamlObj YamlSetting; if err := v.Unmarshal(&yamlObj) ; err != nil{ fmt.Printf("err:%s",err) } fmt.Println(yamlObj) /* result: {2018-10-18 10:09:23 Shenzhen 518000 {Sunny 50000000 200 [Finance Design Program Sales] false}} */ }
viper也提供了讀取Command Line參數(shù)的功能:
package main import ( "github.com/spf13/pflag" "github.com/spf13/viper" "fmt" ) func main() { pflag.String("hostAddress", "127.0.0.1", "Server running address") pflag.Int64("port", 8080, "Server running port") pflag.Parse() viper.BindPFlags(pflag.CommandLine) fmt.Printf("hostAddress :%s , port:%s", viper.GetString("hostAddress"), viper.GetString("port")) /* example: go run main2.go --hostAddress=192.192.1.10 --port=9000 help: Usage of /tmp/go-build183981952/b001/exe/main: --hostAddress string Server running address (default "127.0.0.1") --port int Server running port (default 8080) */ }
很多時候,我們服務(wù)器啟動之后,如果臨時想修改某些配置參數(shù),需要重啟服務(wù)器才能生效,但是viper提供了監(jiān)聽函數(shù),可以免重啟修改配置參數(shù),非常的實用:
package main import ( "github.com/spf13/viper" "fmt" "golang.org/x/net/context" "github.com/fsnotify/fsnotify" ) func main() { //讀取yaml文件 v := viper.New() //設(shè)置讀取的配置文件 v.SetConfigName("linux_config") //添加讀取的配置文件路徑 v.AddConfigPath("./config/") //windows環(huán)境下為%GOPATH,linux環(huán)境下為$GOPATH v.AddConfigPath("$GOPATH/src/") //設(shè)置配置文件類型 v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { fmt.Printf("err:%s\n", err) } //創(chuàng)建一個信道等待關(guān)閉(模擬服務(wù)器環(huán)境) ctx, _ := context.WithCancel(context.Background()) //cancel可以關(guān)閉信道 //ctx, cancel := context.WithCancel(context.Background()) //設(shè)置監(jiān)聽回調(diào)函數(shù) v.OnConfigChange(func(e fsnotify.Event) { fmt.Printf("config is change :%s \n", e.String()) //cancel() }) //開始監(jiān)聽 v.WatchConfig() //信道不會主動關(guān)閉,可以主動調(diào)用cancel關(guān)閉 <-ctx.Done() /* result: config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE */ }
完結(jié)
viper還有許多好用的功能,此文章只是舉例說明了很小的部分。
補充:viper-配置信息處理框架(golang)
項目地址https://github.com/spf13/viper
1. viper
viper讀取配置信息的優(yōu)先級順序,從高到底:
顯式調(diào)用Set函數(shù)
命令行參數(shù)
環(huán)境變量
配置文件
key/value存儲系統(tǒng)
默認(rèn)值
2. 設(shè)置值
(1)設(shè)置默認(rèn)值
viper.SetDefault("ContentDir", "content")
...
(2)讀取配置文件
viper.SetConfigName("xxx") // 設(shè)置配置文件名,不要帶后綴 viper.AddConfigPath("/path") // 第一個搜索路徑 viper.AddConfigPath("../etc") // 設(shè)置為相對路徑 err := viper.ReadInConfig() // 搜索路徑,并讀取配置數(shù)據(jù)
(3)***監(jiān)視配置文件
viper支持應(yīng)用程序運行時擁有讀取配置文件的能力
viper實例通過WatchConfig函數(shù):
viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event)) { fmt.Println("Config file changed:", e.Name) })
(4)Set調(diào)用
viper.Set("Verbose", true)
viper.Set("LogFile", LogFile)
(5)綁定命令行參數(shù)
***viper支持綁定pflags參數(shù)【pflags是一個命令行參數(shù)解析庫】
serveCmd.Flags().Int("port", 1138, "Port to run Application server on")
viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
3. 獲取值
Get(key string) : interface{} GetBool(key string) : bool GetFloat64(key string) : float64 GetInt(key string) : int GetString(key string) : string GetStringMap(key string) : map[string]interface{} GetStringMapString(key string) : map[string]string GetStringSlice(key string) : []string GetTime(key string) : time.Time GetDuration(key string) : time.Duration IsSet(key string) : bool
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
GoLang協(xié)程庫libtask學(xué)習(xí)筆記
libtask一個C語言的協(xié)程庫,是go語言的前身很早期的原型. 測試機器是我的mac air 安裝的centos虛擬機(只有一個核), 代碼沒有采用任何優(yōu)化,只是使用默認(rèn)配置2022-12-12利用systemd部署golang項目的實現(xiàn)方法
這篇文章主要介紹了利用systemd部署golang項目的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11淺談beego默認(rèn)處理靜態(tài)文件性能低下的問題
下面小編就為大家?guī)硪黄獪\談beego默認(rèn)處理靜態(tài)文件性能低下的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06