如何在Go的envconfig库中使用“默认”结构标签?

时间:2019-10-15 01:04:44

标签: go environment-variables

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

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

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的{​​{1}}值为foo,除非我设置了bar环境变量?

2 个答案:

答案 0 :(得分:1)

在回答中,您不小心解决了该问题。不需要大写的config。是Foo。以下工作:Demo

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

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

小写字母是私人的,大写字母是公共的。

答案 1 :(得分:0)

一些实验表明,configfoo都应大写(分别大写为ConfigFoo)。以下程序,

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)
}

产生预期的bar

> go run use_envconfig.go
bar