首页 > 解决方案 > 使用 viper 定义 golang 程序配置时使用最大精度

问题描述

我想用以下要求初始化我的应用程序的配置,即优先级

但是,我想要以下信息的单一事实:

我能想到的最接近的是以下结构:

// the name of the configuration variables
const (
    apiHost         = "APIHost"
    apiPort         = "APIPort"
    readTimeout     = "ReadTimeout"
)

var defaults = map[string]interface{}{
    apiHost:         "0.0.0.0",
    apiPort:         3000,
    readTimeout:     5 * time.Second,
}

// within a func
    for k, v := range defaults {
        viper.SetDefault(k, v)
    }

然而,问题是(暂时不考虑帮助消息)我无法利用上述结构来创建一致的标志,因为无法使用地图索引表达式

pflag.Int(apiHost, int(defaults[apiPort]), "help message for flagname") // errors out

上面的“迫使”我在另一个地方apiPort定义默认值,因为我想我也必须3000在这一行中硬编码(除了我的defaults结构)

有没有办法viper获得一个单一的事实点(无论是地图还是结构)来提供默认值的创建以及与每个配置变量相对应的标志?

标签: goconfiguration

解决方案


推荐阅读