使用viper定义golang程序配置时使用最大精度

使用viper定义golang程序配置时使用最大精度,go,configuration,Go,Configuration,我想用以下要求初始化我的应用程序配置,即优先级 cmd标志 环境变量 配置文件 默认值 但是,我希望以下信息有一点真实性: 每个配置变量的名称 其类型 当涉及到标志时,它会显示帮助消息 它的默认值 我能想到的最接近的结构是以下结构: // the name of the configuration variables const ( apiHost = "APIHost" apiPort = "APIPort&

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

  • cmd标志
  • 环境变量
  • 配置文件
  • 默认值
但是,我希望以下信息有一点真实性:

  • 每个配置变量的名称
  • 其类型
  • 当涉及到标志时,它会显示帮助消息
  • 它的默认值
我能想到的最接近的结构是以下结构:

// 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
(除了我的
默认值
结构)

viper
中有没有一种方法可以让一个真实点(无论这是一个映射还是一个结构)来创建默认值以及对应于每个配置变量的标志