Go语言 如果env var为空,如何分配默认值?

kmb7vmvb  于 2024-01-04  发布在  Go
关注(0)|答案(8)|浏览(106)

如果Go中没有设置环境变量,如何分配默认值?
在Python中,我可以使用mongo_password = os.getenv('MONGO_PASS', 'pass'),其中pass是默认值,如果没有设置MONGO_PASS env var。
我尝试了一个基于os.Getenv为空的if语句,但由于if语句中变量赋值的作用域,这似乎不起作用。而且我正在检查多个env var,所以我不能在if语句中处理此信息。

jdzmm42g

jdzmm42g1#

没有内置的回退到默认值,所以你必须做一个很好的老式的if-else。
但是你总是可以创建一个helper函数来使其更容易:

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

字符串
请注意,正如@ michael-hausengland在评论中指出的那样,请记住,如果环境变量的值真的为空,您将获得回退值。
更好的是,正如@ KokaszWojciechowski指出的那样,使用os.LookupEnv

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

vddsk6oq

vddsk6oq2#

您要查找的是os.LookupEnvif语句的组合。
以下是janos更新后使用LookupEnv的答案:

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

字符串

o4tp2gmn

o4tp2gmn3#

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

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

字符串

jljoyd4f

jljoyd4f4#

为了有一个干净的代码,我这样做:

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

字符串
我定义了一个在整个应用中使用的函数

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

wljmcqd8

wljmcqd85#

和OP有同样的问题,发现有人把这个线程的答案封装到一个相当简单易用的漂亮库中,希望这对其他人有帮助!
https://github.com/caarlos0/env

wwodge7n

wwodge7n6#

对于更复杂的应用程序,您可以使用工具,如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)
}

字符串

xoefb8l8

xoefb8l87#

我也遇到了同样的问题,我只是创建了一个名为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)
}

字符串

7tofc5zh

7tofc5zh8#

如果您不介意添加一些依赖项,则可以使用类似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)
}

字符串

相关问题