ToB企服应用市场:ToB评测及商务社交产业平台

标题: 每日一库:使用Viper处理Go应用程序的配置 [打印本页]

作者: 络腮胡菲菲    时间: 2023-10-3 04:01
标题: 每日一库:使用Viper处理Go应用程序的配置
在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。
什么是Viper?

Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式。它还支持环境变量、命令行标志、远程配置系统(如etcd或Consul),并且可以直接监控配置文件的变化。
如何使用Viper?

读取配置文件

首先,我们需要告诉Viper去哪里找配置文件,以及如何读取它们。这可以通过以下代码实现:
  1. viper.SetConfigName("config") // 配置文件名(不带后缀)
  2. viper.SetConfigType("yaml") // 如果配置文件名没有扩展名,需要设置此项
  3. viper.AddConfigPath("/etc/appname/")   // 查找配置文件所在的路径
  4. viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个搜索路径
  5. err := viper.ReadInConfig() // 查找并读取配置文件
  6. if err != nil { // 处理读取配置文件的错误
  7.     panic(fmt.Errorf("Fatal error config file: %s \n", err))
  8. }
复制代码
获取配置值

一旦Viper读取了配置文件,我们就可以使用Get函数来获取配置值:
  1. port := viper.GetInt("port")
  2. databaseDriver := viper.GetString("database.driver")
复制代码
设置默认值

Viper也允许我们设置配置的默认值。这在配置项未在配置文件中定义,但我们又需要一个默认值的情况下非常有用:
  1. viper.SetDefault("ContentDir", "content")
  2. viper.SetDefault("LayoutDir", "layouts")
复制代码
使用环境变量

Viper可以读取环境变量:
  1. viper.AutomaticEnv()
  2. databaseUrl := viper.Get("DATABASE_URL")
复制代码
使用命令行标志

Viper也可以与标准库的flag包一起使用,以处理命令行标志:
  1. var cfgFile string
  2. func init() {
  3.     flag.StringVar(&cfgFile, "c", "", "config file")
  4.     flag.Parse()
  5. }
  6. func main() {
  7.     if cfgFile != "" { // 如果指定了配置文件,则解析指定的配置文件
  8.         viper.SetConfigFile(cfgFile)
  9.         err := viper.ReadInConfig()
  10.         if err != nil {
  11.             log.Fatalf("Error reading config file, %s", err)
  12.         }
  13.     }
  14.     // ...
  15. }
复制代码
监控配置变化并重新加载配置

Viper甚至可以监控配置文件的变化,并在文件变化时重新加载配置:
  1. viper.WatchConfig()
  2. viper.OnConfigChange(func(e fsnotify.Event) {
  3.     fmt.Println("Config file changed:", e.Name)
  4. })
复制代码
最后

Viper是一个强大的库,可以帮助我们处理Go应用程序的配置。它支持多种配置源,包括配置文件、环境变量、命令行参数等等,使得处理配置变得简单而直观。
  
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4