欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊聊Golang中很好用的viper配置模塊

 更新時間:2020年12月17日 14:35:57   作者:龍舞飛揚v  
這篇文章主要介紹了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)目錄如下:

準備測試使用的yaml文件,注意yaml的格式十分嚴格,主要是每個冒號后面必須要有空格,數(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)

默認值

2. 設(shè)置值

(1)設(shè)置默認值

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)文章

  • Go并發(fā)調(diào)用的超時處理的方法

    Go并發(fā)調(diào)用的超時處理的方法

    這篇文章主要介紹了Go并發(fā)調(diào)用的超時處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • go語言實現(xiàn)的memcache協(xié)議服務(wù)的方法

    go語言實現(xiàn)的memcache協(xié)議服務(wù)的方法

    這篇文章主要介紹了go語言實現(xiàn)的memcache協(xié)議服務(wù)的方法,實例分析了Go語言使用memcache的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • golang變量uint、int大小溢出后的結(jié)果方式

    golang變量uint、int大小溢出后的結(jié)果方式

    在Go語言中,變量的大小溢出后,`uint`類型會回繞到最小值,而`int`類型會回繞到最大值的相反數(shù),例如,`uint8`溢出后會變成0,`int64`溢出后會變成最小的負數(shù)
    2024-12-12
  • Go語言服務(wù)器開發(fā)之客戶端向服務(wù)器發(fā)送數(shù)據(jù)并接收返回數(shù)據(jù)的方法

    Go語言服務(wù)器開發(fā)之客戶端向服務(wù)器發(fā)送數(shù)據(jù)并接收返回數(shù)據(jù)的方法

    這篇文章主要介紹了Go語言服務(wù)器開發(fā)之客戶端向服務(wù)器發(fā)送數(shù)據(jù)并接收返回數(shù)據(jù)的方法,實例分析了客戶端的開發(fā)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 從生成CRD到編寫自定義控制器教程示例

    從生成CRD到編寫自定義控制器教程示例

    這篇文章主要為大家介紹了從生成CRD到編寫自定義控制器的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Golang實現(xiàn)gRPC的Proxy的原理解析

    Golang實現(xiàn)gRPC的Proxy的原理解析

    gRPC是Google開始的一個RPC服務(wù)框架, 是英文全名為Google Remote Procedure Call的簡稱,廣泛的應(yīng)用在有RPC場景的業(yè)務(wù)系統(tǒng)中,這篇文章主要介紹了Golang實現(xiàn)gRPC的Proxy的原理,需要的朋友可以參考下
    2021-09-09
  • Go語言操作Excel的實現(xiàn)示例

    Go語言操作Excel的實現(xiàn)示例

    excelize是一個功能豐富且易于使用的Go語言庫,它極大地簡化了Excel文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 如何使用go實現(xiàn)創(chuàng)建WebSocket服務(wù)器

    如何使用go實現(xiàn)創(chuàng)建WebSocket服務(wù)器

    文章介紹了如何使用Go語言和gorilla/websocket庫創(chuàng)建一個簡單的WebSocket服務(wù)器,并實現(xiàn)商品信息的實時廣播,感興趣的朋友一起看看吧
    2024-11-11
  • Golang 1.18新特性模糊測試用法詳解

    Golang 1.18新特性模糊測試用法詳解

    模糊測試是一種軟件測試技術(shù)。其核心思想是將自動或半自動生成的隨機數(shù)據(jù)輸入到一個程序中,并監(jiān)視程序異常,如崩潰,斷言失敗,以發(fā)現(xiàn)可能的程序錯誤,比如內(nèi)存泄漏,本文給大家介紹了Golang 1.18 新特性模糊測試,感興趣的同學(xué)可以參考閱讀下
    2023-05-05

最新評論