猿问

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

我正在尝试在程序中使用该envconfig库https://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的 值为?foobarAPP_FOO


SMILET
浏览 127回答 2
2回答

缥缈止盈

在您的回答中,您无意中解决了问题。并不是config需要大写。是的Foo。以下作品:演示。type config struct {     Foo string `default:"bar"`     }在 Go 中,只有大写字段可以在当前包之外访问。Envconfig 只能访问大写字段。将它们视为私人和公共财产。小写是私有的,大写是公共的。

吃鸡游戏

一些实验表明 和 都config应该foo大写(分别为Config和Foo)。下面的程序,package mainimport (    "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.gobar
随时随地看视频慕课网APP

相关分类

Go
我要回答