Go 如果环境变量为空,如何分配默认值?

Go 如果环境变量为空,如何分配默认值?,go,environment-variables,Go,Environment Variables,如果Go中未设置环境变量,如何分配默认值 在Python中,我可以执行mongo\u password=os.getenv('mongo\u PASS','PASS')其中PASS是默认值,如果未设置mongo\u PASSenv var 我尝试了一个基于os.Getenv为空的if语句,但由于if语句中变量赋值的范围,这似乎不起作用。我正在检查多个env var,因此无法在if语句中对这些信息执行操作。没有内置的可返回到默认值, 所以,你必须做一个好的老式的,如果不是这样的话 但您始终可以创建

如果Go中未设置环境变量,如何分配默认值

在Python中,我可以执行
mongo\u password=os.getenv('mongo\u PASS','PASS')
其中
PASS
是默认值,如果未设置
mongo\u PASS
env var


我尝试了一个基于
os.Getenv
为空的if语句,但由于if语句中变量赋值的范围,这似乎不起作用。我正在检查多个env var,因此无法在if语句中对这些信息执行操作。

没有内置的可返回到默认值, 所以,你必须做一个好的老式的,如果不是这样的话

但您始终可以创建一个帮助器函数来简化此操作:

func getenv(key, fallback string) string {
    value := os.Getenv(key)
    if len(value) == 0 {
        return fallback
    }
    return value
}
请注意,正如在评论中指出的, 请记住,如果环境变量的值真的为空,您将得到回退值

如前所述,更好的方法是使用:


如果您可以添加一点依赖项,您可以使用


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

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

要获得干净的代码,我需要执行以下操作:

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
}

您要查找的内容与
if
语句结合使用

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

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

与OP有相同的问题,发现有人将此线程中的答案封装到一个非常简单易用的漂亮库中,希望这对其他人有所帮助


对于更复杂的应用程序,您可以使用工具,例如
viper
,它允许您设置全局自定义默认值、解析配置文件、为应用程序的环境变量键设置前缀(以确保环境变量配置的一致性和名称间隔)以及许多其他酷功能

示例代码:

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)
}

我也有同样的问题,我只是创建了一个小程序包,名为“精确地回答这个问题”

Getenvs支持
string
bool
int
float
,可以如下使用:

主程序包
进口(
“fmt”
“gitlab.com/avarf/getenvs”
)
func main(){
值:=getenvs.GetEnvString(“STRING\u GETENV”,“默认字符串值”)
bvalue,uu:=getenvs.GetEnvBool(“BOOL_GETENV”,false)
ivalue,:=getenvs.GetEnvInt(“INT_GETENV”,10)
格式打印项次(值)
格式打印项次(B值)
fmt.Println(伊瓦鲁)
}

一个
如果
有效。@沃尔克有效吗?我用“`mpass:=os.Getenv(“MONGO_PASS”)if len(mpass)==0{log.Println(“MONGO_PASS env var not set,using MONGO default”)mpass:=“PASS”}``进行了尝试,结果是:
/server.go:63:mpass已声明且未使用
,其中第63行与if块中的mpass变量对齐(我稍后使用mpass).想出来了。应该在
if
语句中的
mpas
上使用
=
而不是
:=
。谢谢你叫我出来沃尔克:-)谢谢你的建议,迈克尔。我完全尝试了,这与我最初的尝试类似,它抱怨if块中的mongo_密码没有被使用(错误与我在上面对Volker的评论相同。我认为这有时与if块中的变量被限制在该块内,并且无法超出该块的事实有关?或者我弄错了,这是声明的变量…我的错误是由于我如何使用该变量造成的?请注意,
mongo\u密码:=“pass”
是必不可少的,因为有了这个
mongo\u密码
是声明和定义的(设置为
pass
作为默认值)。如果你没有那一行,我可以想象一个错误。在我们上面的例子中,只有
mp
具有
If
的本地范围,FWIW.ohhhhh.灯泡。谢谢。我把声明搞错了(:=)和赋值(=)。工作起来就像一个冠军。你可以摇滚迈克尔。注意,虽然上面的代码是正确的,但你应该注意语义:因为它测试字符串
的长度,而空字符串
的长度为0,这意味着当env变量设置为
您将获得回退/默认值,而不是值(通常是
)。这取决于您的用例,但我认为值得指出,因为我曾经遇到过这个语义错误,并在调试它时花费了几个周期;)您可以使用
LookupEnv
,而不是
Getenv
。它还返回值确实存在的
ok boolean
状态。
func getEnv(key, fallback string) string {
    value, exists := os.LookupEnv(key)
    if !exists {
        value = fallback
    }
    return value
}
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)
}