在 YML 中使用具有默认值的 env 变量

我有以下代码从yml读取配置文件,其中也包括ENV变量:


confContent, err := ioutil.ReadFile("config.yml")

    if err != nil {

        panic(err)

    }

    // expand environment variables

    confContent = []byte(os.ExpandEnv(string(confContent)))

    conf := &SysConfig{}

    if err := yaml.Unmarshal(confContent, conf); err != nil {

        panic(err)

    }

config.yml


db:

  name: ${DB_NAME:qm}

  host: localhost


它正在工作,但是如果没有给出env,我怎么能让它读取默认值?DB_NAME


尚方宝剑之说
浏览 276回答 3
3回答

呼如林

您可以使用时替换映射器,并考虑默认值,如下所示:ExpandEnvExpandpackage mainimport (    "fmt"    "os"    "strings")func main() {    mapper := func(placeholderName string) string {        split := strings.Split(placeholderName, ":")        defValue := ""        if len(split) == 2 {            placeholderName = split[0]            defValue = split[1]        }        val, ok := os.LookupEnv(placeholderName)        if !ok {            return defValue        }        return val    }    os.Setenv("DAY_PART", "morning")    fmt.Println(os.Expand("Good ${DAY_PART:test}, ${NAME:Gopher}", mapper))}这将呈现Good morning, Gopher这是基于操作系统包文档中的扩展中的示例。

Smart猫小萌

我建议你使用spf13)的真棒Viper软件包来读取conf文件,它可以优雅地解决你的问题,你可以用它来加载许多其他类型的配置文件。解决您的问题获取软件包    go get github.com/spf13/viper配置文件假设你有名为的配置文件:db.yamldb:   name: somedb   host: localhost代码示例正如我们所看到的,一旦Viper加载了conf文件,我们就可以通过键获取值。Yaml文件将被解析为嵌套结构,您可以将其解封为Golang结构,我们应该使用它来获取值,您可以参考此页面以获取更多用法信息。viper.GetString("db.name")import (    "fmt"    "github.com/spf13/viper")func InitConf() {    viper.AutomaticEnv()     // read system env     viper.SetConfigName("db")  // conf file name to be load    viper.AddConfigPath(".")    // conf file path    viper.SetDefault("db.name", "mysqldb") // you can set default da name value here     // do read conf file and handle error    if err := viper.ReadInConfig(); err != nil {        if _, ok := err.(viper.ConfigFileNotFoundError); ok {            // Config file not found; ignore error if desired        } else {            // Config file was found but another error was produced        }    }    fmt.Printf("db.name: %s", viper.GetString("db.name"))}viper.AutomaticEnv()此方法将自动读取系统 env,假设您有一个名为 env 的 env,然后您可以通过以下方式获取它。如果 env 名称与配置文件密钥的名称相同,则 viper 首先使用 envENV_XXXviper.GetString("ENV_XXX")当我们不设置输出时,输出将是namedb.yamldb.name: mysqldb当我们设置值时:在 db.yaml 中,输出将是namesomedbdb.name: somedb希望你会发现它有用!有关用法的更多详细信息,请参阅蝰蛇自述文件

守着一只汪

我猜你有一个这样的会议结构:Db *struct{         Name string         Host string     }因此,要检索Dbname的默认变量,您必须像这样检查它:if conf.Db == nil || conf.Db.Name == "" {         conf.Db.Name = "test"     }
打开App,查看更多内容
随时随地看视频慕课网APP