我正在尝试在其中大多数配置变量具有默认值的程序中使用envconfig
库https://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
环境变量?
答案 0 :(得分:1)
在回答中,您不小心解决了该问题。不需要大写的config
。是Foo
。以下工作:Demo。
type config struct {
Foo string `default:"bar"`
}
在Go中,仅大写字段可在当前包之外访问。 Envconfig只能访问大写的字段。可以将它们视为私有和公共财产。
小写字母是私人的,大写字母是公共的。
答案 1 :(得分:0)
一些实验表明,config
和foo
都应大写(分别大写为Config
和Foo
)。以下程序,
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