• Go 使用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应用程序的配置。它支持多种配置源,包括配置文件、环境变量、命令行参数等等,使得处理配置变得简单而直观。

  • 相关阅读:
    物理机环境搭建-linux部署nginx
    【VUE复习·8】v-if;v-show高级
    Java调试谷歌PC浏览器,控制操作网页
    Web jQuery—属性、元素、尺寸和位置
    Linux——centos7.4磁盘空间调整分配
    智汇云舟总裁周舟受邀出席“2022数字生态大会” 分享视频孪生的应用与价值
    博途1200/1500PLC斜坡指令RAMP(带暂停功能)
    python使用mitmproxy和mitmdump抓包以及对手机
    解决 Could not resolve com.android.tools.build:gradle:4.2.2 问题
    【开源】基于Vue.js的中小学教师课程排课系统
  • 原文地址:https://blog.csdn.net/weixin_45925028/article/details/134434646