(转)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 
", 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

原文地址:https://www.cnblogs.com/zhangmingcheng/p/14108298.html