简介
github Viper是适用于Go应用程序的完整配置解决方案,它被用于设计再应用程序中工作,并且可以处理所有类型的配置需求和格式,它支持以下特性:
设置默认值从 JSON、TOML、YAML、HCL、envfile 和 Java properties配置文件读取实时观看和重新阅读配置文件(可选)从环境变量中读取从远程配置系统(etcd 或 Consul)读取,并监控配置变化从命令行标志读取配置从buffer读取配置显式配置值
快速开始
快速开始以YAML为例;YAML教程
YAML
name: test
redis:
host: 127.0.0.1
port: 6379
go
package main
import (
"fmt"
"github.com/spf13/viper"
)
type RedisConfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
}
type ServerConfig struct {
Name string `mapstructure:"name"`
RedisConfig RedisConfig `mapstructure:"redis"`
}
func main() {
v := viper.New()
// 路径必须要写相对路径,相对于项目的路径
v.SetConfigFile("viper/demo01/config.yaml")
if err := v.ReadInConfig(); err != nil {
panic(err)
}
// 单个取值
name := v.Get("name").(string)
// 映射到结构体
var s ServerConfig
if err := v.Unmarshal(&s);err != nil{
panic(err)
}
fmt.Println(s)
fmt.Println(name)
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/ad826f4b49d74b52b9f2b42d0cccd524.png#pic_center)
动态监控变化
package main
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"time"
)
type RedisConfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
}
type ServerConfig struct {
Name string `mapstructure:"name"`
RedisConfig RedisConfig `mapstructure:"redis"`
}
func main() {
v := viper.New()
// 路径必须要写相对路径,相对于项目的路径
v.SetConfigFile("viper/demo02/config.yaml")
if err := v.ReadInConfig(); err != nil {
panic(err)
}
// 映射到结构体
var s ServerConfig
if err := v.Unmarshal(&s); err != nil {
panic(err)
}
fmt.Println(s)
// 监听配置文件变化
v.WatchConfig()
v.OnConfigChange(func(in fsnotify.Event) {
fmt.Printf("配置文件:%s发生改变\n", in.Name)
if err := v.ReadInConfig(); err != nil {
panic(err)
}
if err := v.Unmarshal(&s); err != nil {
panic(err)
}
fmt.Println(s)
})
// 睡眠30秒让函数不要马上结束;给修改文件留出时间
time.Sleep(30 * time.Second)
}
修改完文件要按Ctrl+s保存,这样viper才能监听到文件的变化
|