您好,登錄后才能下訂單哦!
這篇文章主要介紹“Golang中viper配置模塊的應(yīng)用方法”,在日常操作中,相信很多人在Golang中viper配置模塊的應(yīng)用方法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Golang中viper配置模塊的應(yīng)用方法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
viper 支持Yaml、Json、 TOML、HCL 等格式,讀取非常的方便。
go get github.com/spf13/viper
如果提示找不到golang.org/x/text/這個(gè)庫(kù),是因?yàn)間olang.org/x/text/這個(gè)庫(kù)在GitHub上托管的路徑不一致。
解決辦法:
可以從https://github.com/golang/text下載源碼下來(lái),然后到$GOPATH/src下面創(chuàng)建golang.org/x/文件夾(已存在的忽略),把壓縮包的文件解壓到golang.org/x/文件夾之下。
然后執(zhí)行 go install -x golang.org/x/text 即可解決:
初始結(jié)構(gòu)目錄如下:
準(zhǔn)備測(cè)試使用的yaml文件,注意yaml的格式十分嚴(yán)格,主要是每個(gè)冒號(hào)后面必須要有空格,數(shù)組前要加“-”號(hào)表示連續(xù)(注意減號(hào)后面也有空格),內(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è)置配置文件類(lèi)型 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è)置配置文件類(lèi)型 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) */ }
很多時(shí)候,我們服務(wù)器啟動(dòng)之后,如果臨時(shí)想修改某些配置參數(shù),需要重啟服務(wù)器才能生效,但是viper提供了監(jiān)聽(tīng)函數(shù),可以免重啟修改配置參數(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è)置配置文件類(lèi)型 v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { fmt.Printf("err:%s\n", err) } //創(chuàng)建一個(gè)信道等待關(guān)閉(模擬服務(wù)器環(huán)境) ctx, _ := context.WithCancel(context.Background()) //cancel可以關(guān)閉信道 //ctx, cancel := context.WithCancel(context.Background()) //設(shè)置監(jiān)聽(tīng)回調(diào)函數(shù) v.OnConfigChange(func(e fsnotify.Event) { fmt.Printf("config is change :%s \n", e.String()) //cancel() }) //開(kāi)始監(jiān)聽(tīng) v.WatchConfig() //信道不會(huì)主動(dòng)關(guān)閉,可以主動(dòng)調(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 */ }
到此,關(guān)于“Golang中viper配置模塊的應(yīng)用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。