golang常用库:配置文件解析库-viper使用

viper 配置解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 也是他开发。总之,他在golang领域是专家。

他的github地址:https://github.com/spf13

viper是一个配置解析的解决方案,它能够从 json,toml,ini,yaml,hcl,env 等多种格式文件中,读取配置内容,它还能从一些远程配置中心读取配置文件,如consul,etcd等;它还能够监听文件的内容变化。

viper的 logo:

golang常用库:配置文件解析库-viper使用

二、viper功能介绍

读取 json,toml,ini,yaml,hcl,env 等格式的文件内容

读取远程配置文件,如 consul,etcd 等和监控配置文件变化

读取命令行 flag 的值

从 buffer 中读取值

配置文件又可以分为不同的环境,比如dev,test,prod等。

viper 可以帮助你专注管理配置文件。

viper 读取配置文件的优先顺序,从高到低,如下:

显式设置的Set函数

命令行参数

环境变量

配置文件

远程k-v 存储系统,如consul,etcd等

默认值

Viper 配置key是不区分大小写的。

其实,上面的每一种文件格式,都有一些比较有名的解析库,如:

toml :https://github.com/BurntSushi/toml

json :json的解析库比较多,下面列出几个常用的

https://github.com/json-iterator/go

https://github.com/mailru/easyjson

https://github.com/bitly/go-simplejson

https://github.com/tidwall/gjson

ini : https://github.com/go-ini/ini
等等单独文件格式解析库。

但是为啥子要用viper,因为它是一个综合文件解析库,包含了上面所有的文件格式解析,是一个集合体,少了配置多个库的烦恼。

三、viper使用

安装viper命令:
go get github.com/spf13/viper

3.1 把值存入Viper里

文档:

设置默认值

viper 支持默认值的设置。如果配置文件、环境变量、远程配置中没有设置键值,就可以通过viper设置一些默认值。

Examples:

viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) 读取配置文件

读取配置文件说明

读取配置文件要求:最少要知道从哪个位置查找配置文件。用户一定要设置这个路径。

viper可以从多个路径搜索配置文件,单个viper实例只支持单个配置文件。
viper本身没有设置默认的搜索路径,需要用户自己设置默认路径。

viper搜索和读取配置文件例子片段

viper.SetConfigName("config") // 配置文件的文件名,没有扩展名,如 .yaml, .toml 这样的扩展名 viper.SetConfigType("yaml") // 设置扩展名。在这里设置文件的扩展名。另外,如果配置文件的名称没有扩展名,则需要配置这个选项 viper.AddConfigPath("/etc/appname/") // 查找配置文件所在路径 viper.AddConfigPath("$HOME/.appname") // 多次调用AddConfigPath,可以添加多个搜索路径 viper.AddConfigPath(".") // 还可以在工作目录中搜索配置文件 err := viper.ReadInConfig() // 搜索并读取配置文件 if err != nil { // 处理错误 panic(fmt.Errorf("Fatal error config file: %s \n", err)) }

说明:
这里执行viper.ReadInConfig()之后,viper才能确定到底用哪个文件,viper按照上面的AddConfigPath() 进行搜索,找到第一个名为 config.ext (这里的ext代表扩展名: 如 json,toml,yaml,yml,ini,prop 等扩展名) 的文件后即停止搜索。

如果有多个名称为config的配置文件,viper怎么搜索呢?它会按照如下顺序搜索

config.json

config.toml

config.yaml

config.yml

config.properties (这种一般是java中的配置文件名)

config.props (这种一般是java中的配置文件名)

你还可以处理一些特殊情况:

if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { // 配置文件没有找到; 如果需要可以忽略 } else { // 查找到了配置文件但是产生了其它的错误 } } // 查找到配置文件并解析成功

注意[自1.6起]:  你也可以有不带扩展名的文件,并以编程方式指定其格式。对于位于用户$HOME目录中的配置文件没有任何扩展名,如.bashrc。

完整例子examples

1. 读取配置文件

config.toml 配置文件:

# this is a toml title = "toml exaples" redis = "127.0.0.1:3300" # redis [mysql] host = "192.168.1.1" ports = 3306 username = "root" password = "root123456"

viper_toml.go:

package main import( "fmt" "github.com/spf13/viper" ) // 读取配置文件config type Config struct { Redis string MySQL MySQLConfig } type MySQLConfig struct { Port int Host string Username string Password string } func main() { // 把配置文件读取到结构体上 var config Config viper.SetConfigName("config") viper.AddConfigPath(".") err := viper.ReadInConfig() if err != nil { fmt.Println(err) return } viper.Unmarshal(&config) //将配置文件绑定到config上 fmt.Println("config: ", config, "redis: ", config.Redis) }

2. 读取多个配置文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsffxg.html