(轉)Golang第三方包Viper的使用


【摘要】

viper是一個簡單好用的讀取配置文件的第三方開源庫,它支持多種類型配置的讀寫,包括json、yml、環境變量、命令行等,使用該庫可以免去一些繁瑣的配置讀取代碼實現。

一  基本原理

當viper被調用來獲取參數時,它的基本執行邏輯如下:

1.通過自己的內部實現,獲取指定對象(配置文件,環境變量等)的內容

2.將獲取的內容解析,得到鍵值對集合,並將其存入自身的storage中

3.等待ReadInConfig,或GetInt等方法取值

從上面描述可知,無論viper獲取參數的來源是什么,最終的參數集合都是viper內部存放的鍵值對集合,也就可以使用viper.Get等方法獲取,這種方案的好處就是,當配置來源發生變化時,只需要修改viper的來源解析代碼,而不需要對已經嵌入業務代碼的參數讀寫邏輯做任何修改。

二  使用方法

首先,通過命令go get github.com/spf13/viper 獲取viper包

2.1     讀取配置文件:

通過指定目錄和文件名、文件類型,即可實現對指定文件的配置讀取:

viper.SetConfigName("config") // 文件名
viper.AddConfigPath("/etc/appname/")   // 文件路徑
viper.AddConfigPath("$HOME/.appname")  //可以使用多個文件路徑           
err := viper.ReadInConfig() // 將配置讀入viper中存儲
err != nil { // Handle errors reading the config file
       panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
... //viper.GetString(...)

2.2     讀取配置流:

viper.SetConfigType("yaml") // 設置配置的格式類型
var yamlExample = []byte(...) //...中為yml格式的字符串
viper.ReadConfig(bytes.NewBuffer(yamlExample))  //viper.ReadConfig()可以傳入任//何實現io.Reader接口的對象
viper.Get("name") // 使用Get獲取剛才讀取的結果

2.3     設置參數默認值:

viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

2.4     監聽配置文件的讀寫事件:

配置監聽事件后,當文件出現讀寫操作,就會觸發事件,調用其聲明好的方法,該步驟通常用於處理配置文件的重載,有時也額外用於文件監控功能

viper.WatchConfig()  //啟動監聽
viper.OnConfigChange(func(e fsnotify.Event) {   //注冊文件監控的回調函數
       fmt.Println("Config file changed:", e.Name)
})  

2.5     配置參數別名:

配置參數別名后,使用viper.Get方法時,傳入原本的key或者傳入別名都可以獲取指定參數的值,通常用於美化/簡化配置文件的參數格式

viper.RegisterAlias("base", "別名") //注冊別名
viper.Set("base", true)  
viper.GetBool("base") //結果: true
viper.GetBool("別名") //結果: true

2.6     設置/覆蓋參數值:

手動覆蓋參數,此處不多贅述

viper.Set("base", true)

2.7     獲取命令行參數

viper的命令行參數獲取實際上是通過綁定flag對象實現的,使用方法相對其他幾種配置來源稍微復雜一點

package main
import (
       "flag"
       "github.com/spf13/pflag"
)

func main() {
       // 使用基礎的flag包
       flag.Int("flagname", 1234, "help message for flagname")
    //將flag轉換為pflag
       pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
       pflag.Parse()
    //通過bind,將命令行參數綁定到viper的內部鍵值對集合中
       viper.BindPFlags(pflag.CommandLine)
       i := viper.GetInt("flagname") // 此處已可以獲取參數

---------------------
原文來自【學領未來】,轉載時請保留原文鏈接。
鏈接:http://bbs.learnfuture.com/topic/6900


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM