基本使用
一是读取配置文件时候,路径应该写work-directory相对路径
二是基本流程就是New(), SetConfigFile(), Unmarshal
三是结构体映射
type ServerConfig struct {
ServiceName string `mapstructure:"name"`
Port int `mapstructure:"port"`
}
func main() {
v := viper.New()
//文件的路径如何设置--相对于work-directory来设置的
v.SetConfigFile("user-web/viper_test/ch01/config.yaml")
// 读
if err := v.ReadInConfig(); err != nil {
panic(err)
}
serverConfig := ServerConfig{}
// 反解-到结构体
if err := v.Unmarshal(&serverConfig); err != nil {
panic(err)
}
fmt.Println(serverConfig)
fmt.Printf("%V", v.Get("name"))
}
结构体嵌套映射
配置文件写法
name: 'user-web2'
mysql:
host: '127.0.0.1'
port: 3306
相应的结构体映射
type MysqlConfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
}
type ServerConfig struct {
ServiceName string `mapstructure:"name"`
MysqlInfo MysqlConfig `mapstructure:"mysql"`
}
根据不同环境切换配置文件
一:有两个配置文件 二:根据环境变量,设置开关
// viper去读取环境变量
func GetEnvInfo(env string) bool {
viper.AutomaticEnv()
return viper.GetBool(env)
//刚才设置的环境变量 想要生效 我们必须得重启goland
}
func main() {
// **通过环境变量去更改读取哪个配置文件
debug := GetEnvInfo("MXSHOP_DEBUG")
configFilePrefix := "config"
configFileName := fmt.Sprintf("viper_test/ch02/%s-pro.yaml", configFilePrefix)
if debug {
configFileName = fmt.Sprintf("viper_test/ch02/%s-debug.yaml", configFilePrefix)
}
v := viper.New()
//文件的路径如何设置
v.SetConfigFile(configFileName)
if err := v.ReadInConfig(); err != nil {
panic(err)
}
serverConfig := ServerConfig{}
if err := v.Unmarshal(&serverConfig); err != nil {
panic(err)
}
fmt.Println(serverConfig)
fmt.Printf("%V", v.Get("name"))
}
动态监控配置文件变化
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("e.Name: ", e.Name)
fmt.Println("e.Op: ", e.Op)
_ = v.ReadInConfig()
_ = v.Unmarshal(&serverConfig)
fmt.Println(serverConfig)
})