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


69

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

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

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


4
一个if 的工作。
Volker

@Volker吗?我尝试使用```mpass:= os.Getenv(“ MONGO_PASS”)如果len(mpass)== 0 {log.Println(“ MONGO_PASS env var not set,using mongo default”)mpass:=“ pass”} ```我明白了:./server.go:63: mpass declared and not used
瑞安·克莱尔

第63行在if块中与mpass变量对齐(稍后我将使用mpass)。
瑞安·克莱尔

弄清楚了。本来应该使用=,而不是:=mpass该范围内if声明。感谢您叫我Volker :-)
Ryan Clair

Answers:


118

没有内置函数可以还原为默认值,因此您必须执行良好的老式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
}

3
请注意,尽管上面的代码是正确的,但您应该了解以下语义:由于它测试字符串的长度,value而空字符串的""长度为0,这意味着当将env变量设置为""您时,将得到后备/默认值,而不是比值(微不足道"")。确实取决于您的用例,但是我认为值得指出,因为我曾经遇到过这种语义错误并
花费

20
相反,Getenv您可以使用LookupEnv。它还返回ok boolean该值确实存在的状态。
卢卡斯沃伊切霍夫斯基

36

您要查找的内容os.LookupEnvif声明结合在一起。

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

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

13

Go此处的功能与Python不完全相同;我可以想到,最惯用的方法是:

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

谢谢迈克尔的建议。我完全尝试了这一点,这与我最初的尝试类似,但它抱怨说if块内部未使用mongo_password(与上面对Volker的评论相同,错误相同。我认为这与以下事实有关:如果if块仅限于该块,并且无法进入外面呢?还是我弄错了,那被声明为变量...而我的错误归结于我如何使用变量?
Ryan Clair

1
请注意,该行mongo_password := "pass"是必不可少的,因为使用此行mongo_password进行了声明和定义(设置pass为默认值)。如果您没有那条线,那么我可以想象出一个错误。在上述情况下,仅FWIWmp的本地范围if
迈克尔·豪森布拉斯

1
OHHHHHH。灯泡。谢谢。我在混合声明(:=)和赋值(=)。像冠军一样工作。你摇滚迈克尔。
瑞安·克莱尔

7

为了获得干净的代码,我这样做:

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
}



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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.