简介
viper是一个配置文件读取和写入的框架,支持JSON、YAML、INI等格式。 另外还可以读取监控远程配置文件。
viper: Github仓库地址
安装
go get github.com/spf13/viper
配置
//需要全路径加上后缀名,设置后不会读取其他配置
viper.SetConfigFile("/user/xxx/xxx/config.yaml")
//配置文件路径
viper.AddConfigPath("conf")
//配置文件名字,不需要带后缀
viper.SetConfigName("config")
//配置文件类型
viper.SetConfigType("yaml")
设置了全路径就不需要设置路径和名字、类型了,任选其一。
读取
读取前先要用ReadInConfig()读取整个文件
如果key不存在,返回的是类型0值。
//开始读取配置文件,判断err
if err := viper.ReadInConfig(); err != nil {
fmt.Println("读取出错")
}
//根据key读取值,不区分值类型
viper.Get("name")
//返回string
viper.GetString("name")
//返回bool
viper.GetBool("isTest")
//读取多层级key,像类一样调用
viper.GetString("people.child.work")
//判断key是否存在
if viper.IsSet("school") {
viper.GetString("school")
}
监听配置变化
作用:热更新时,可能会更改配置文件,方便重新读取。
in.name是配置文件的全路径。
//监听配置变化
viper.WatchConfig()
//配置改变时的回调
viper.OnConfigChange(func(in fsnotify.Event) {
switch in.Op {
case fsnotify.Create:
fmt.Println("监听到Create")
case fsnotify.Remove:
fmt.Println("监听到Remove")
case fsnotify.Rename:
fmt.Println("监听到Rename")
case fsnotify.Write:
fmt.Println("监听到Write")
case fsnotify.Chmod:
fmt.Println("监听到Chmod")
}
})
写入
//修改
viper.Set("host", "http://www.baidu.com")
//如果文件已存在,不会写入.不能和SetConfigFile配合使用
viper.SafeWriteConfig()
//不管文件存不存在,直接覆盖原有数据
viper.WriteConfig()
读取系统环境变量
环境变量必须是前缀加上下划线“”。比如APISERVER
//读取系统环境变量
viper.AutomaticEnv()
//设置要读取环境变量的前缀
viper.SetEnvPrefix("APISERVER")
//没有匹配环境变量时,将对应的字符替换,这里将.替换为_
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
同时读取环境变量和配置文件
如果同时存在,viper会以环境变量设置的为准。