文章目录
一、介绍
Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:
- 设置默认值
- 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据
- 可以监视配置文件的变动、重新读取配置文件
- 从环境变量中读取配置数据
- 从远端配置系统中读取数据,并监视它们(比如etcd、Consul)
- 从命令参数中读物配置
- 从buffer中读取
- 调用函数设置配置信息
简单的设置默认值
viper.SetDefault("time", "2019-7-14")
viper.SetDefault("notifyList", []string{"maple","ffm"})
监视配置文件,重新读取配置数据
package main
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
viper:=viper.New()
// 设置一个信道等待关闭
ctx, _ := context.WithCancel(context.Background())
//设置监听回调函数
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Printf("config is change:%s\n", e.String() )
configPaths := v.Get("configpath")
if v.Get("configpath") == nil {
return
}
fmt.Println(configPaths)
for key, val := range configPaths.(map[string] interface{}){
fmt.Println(key)
fmt.Println(val)
}
// cancel() 关闭信道
})
// 开始监听
v.WatchConfig()
// 信道不会主动关闭,可以主动调用cancel关闭
<-ctx.Done()
二、读取config.json
#json文件
{
"appId": "123456789",
"secret": "maple123456",
"host": {
"address": "localhost",
"port": 5799
}
}
package main
import (
"fmt"
"github.com/spf13/viper"
)
//定义config结构体
type Config struct {
AppId string
Secret string
Host Host
}
//json中的嵌套对应结构体的嵌套
type Host struct {
Address string
Port int
}
func main() {
config := viper.New()
config.AddConfigPath("./kafka_demo")
config.SetConfigName("config")
config.SetConfigType("json")
if err := config.ReadInConfig(); err != nil {
panic(err)
}
fmt.Println(config.GetString("appId"))
fmt.Println(config.GetString("secret"))
fmt.Println(config.GetString("host.address"))
fmt.Println(config.GetString("host.port"))
//直接反序列化为Struct
var configjson Config
if err :=config.Unmarshal(&configjson);err !=nil{
fmt.Println(err)
}
fmt.Println(configjson.Host)
fmt.Println(configjson.AppId)
fmt.Println(configjson.Secret)
}
注意:
- 代码中的配置文件不需要写后缀名,但是文件系统中的文件需要写后缀