viper学习

159 阅读1分钟

基本使用

一是读取配置文件时候,路径应该写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)
})