如果env var为空,如何指定默认值?

时间:2016-10-30 06:21:44

标签: go environment-variables

在Gio中,如果没有设置环境变量,如何分配默认值?

在Python中我可以mongo_password = os.getenv('MONGO_PASS', 'pass') pass,如果MONGO_PASS env var未设置,则os.Getenv是默认值。

我尝试了基于val csv = sqlContext.sparkContext.textFile(csvPath).map { case(txt) => try { val reader = new CSVReader(new StringReader(txt), delimiter, quote, escape, headerLines) val parsedRow = reader.readNext() Row(mapSchema(parsedRow, schema) : _*) } catch { case e: IllegalArgumentException => throw new UnsupportedOperationException("converted from Arg to Op except") } } 为空的if语句,但由于if语句中的变量赋值范围,这似乎不起作用。我正在检查多个env var,因此我无法在if语句中对此信息进行操作。

8 个答案:

答案 0 :(得分:55)

没有内置功能可以回退到默认值, 所以你必须做一个老式的if-else。

但是你总是可以创建一个辅助函数来使它更容易:

func getenv(key, fallback string) string {
    value := os.Getenv(key)
    if len(value) == 0 {
        return fallback
    }
    return value
}

请注意,评论中指出@michael-hausenblas为 请记住,如果环境变量的值真的为空,那么您将获得后备值。

@ŁukaszWojciechowski指出更好,使用os.LookupEnv

func getEnv(key, fallback string) string {
    if value, ok := os.LookupEnv(key); ok {
        return value
    }
    return fallback
}

答案 1 :(得分:19)

您正在寻找的是os.LookupEnvif声明。

以下是janos的答案更新后使用LookupEnv:

func getEnv(key, fallback string) string {
    value, exists := os.LookupEnv(key)
    if !exists {
        value = fallback
    }
    return value
}

答案 2 :(得分:5)

Go在这里没有与Python完全相同的功能;我能想到的最常用的方法是:

mongo_password := "pass"
if mp := os.Getenv("MONGO_PASS"); mp != "" {
    mongo_password = mp
}

答案 3 :(得分:2)

要使用干净的代码,我会这样做:

myVar := getEnv("MONGO_PASS", "default-pass")

我定义了一个在整个应用程序中使用的函数

// getEnv get key environment variable if exist otherwise return defalutValue
func getEnv(key, defaultValue string) string {
    value := os.Getenv(key)
    if len(value) == 0 {
        return defaultValue
    }
    return value
}

答案 4 :(得分:2)

与OP有同样的问题,发现有人将这个帖子的答案封装成一个相当简单易用的漂亮的库,希望这有助于其他人!

https://github.com/caarlos0/env

答案 5 :(得分:0)

如果您可以添加少量依赖项,则可以使用https://github.com/urfave/cli

之类的内容
package main

import (
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang, l",
      Value: "english",
      Usage: "language for the greeting",
      EnvVar: "APP_LANG",
    },
  }

  app.Run(os.Args)
}

答案 6 :(得分:0)

对于更复杂的应用程序,您可以使用诸如viper之类的工具,该工具可用于设置全局自定义默认值,解析配置文件,为应用程序的env var键设置前缀(以确保一致性和名称间距)。 env var配置)和许多其他很酷的功能。

示例代码:

package main

import (
    "fmt"

    "github.com/spf13/viper"
)

func main() {
    viper.AutomaticEnv() // read value ENV variable
    // Set default value
    viper.SetEnvPrefix("app")
    viper.SetDefault("linetoken", "DefaultLineTokenValue")

    // Declare var
    linetoken := viper.GetString("linetoken")

    fmt.Println("---------- Example ----------")
    fmt.Println("linetoken :", linetoken)
}

答案 7 :(得分:0)

我也遇到了同样的问题,我刚刚创建了一个名为 getenvs 的小包来解决这个问题。

Getenvs 支持 stringboolintfloat,可以像下面这样使用:

package main

import (
    "fmt"

    "gitlab.com/avarf/getenvs"
)

func main() {
    value := getenvs.GetEnvString("STRING_GETENV", "default-string-value")
    bvalue, _ := getenvs.GetEnvBool("BOOL_GETENV", false)
    ivalue, _ := getenvs.GetEnvInt("INT_GETENV", 10)

    fmt.Println(value)
    fmt.Println(bvalue)
    fmt.Println(ivalue)
}
相关问题