首页 > 解决方案 > 如何在 Go 的 envconfig 库中使用“默认”结构标记?

问题描述

我正在尝试在大多数配置变量具有默认值的程序中使用envconfighttps://github.com/kelseyhightower/envconfig,如果设置了特定的环境变量,我只想覆盖这些默认值。

我尝试运行以下示例程序:

package main

import (
    "fmt"
    "log"

    "github.com/kelseyhightower/envconfig"
)

type config struct {
    foo string `default:"bar"`
}

func main() {
    var cfg config
    if err := envconfig.Process("app", &cfg); err != nil {
        log.Fatalln(err)
    }
    fmt.Println(cfg.foo)
}

没有设置APP_FOO环境变量:

> echo $APP_FOO

但是,这不会bar像我期望的那样打印:

> go run use_envconfig.go 

我看不出我的实现与https://github.com/kelseyhightower/envconfig#struct-tag-support上记录的示例有何不同,以下评论与该示例有关:

如果 envconfig 找不到 的环境变量值MYAPP_DEFAULTVAR,它将使用“foobar”作为默认值填充它。

除非我设置环境变量,否则我怎样才能制作这个程序,以便cfg' 的值foo是?barAPP_FOO

标签: goenvironment-variables

解决方案


在您的回答中,您不小心解决了问题。它不需要config大写。它是Foo。以下作品:演示

type config struct {
    Foo string `default:"bar"`
}

在 Go 中,只有大写的字段可以在当前包之外访问。Envconfig 只能访问大写的字段。将它们视为私人和公共财产。

小写是私有的,大写是公共的。


推荐阅读