如果Go中没有设置环境变量,如何分配默认值?在Python中,我可以使用mongo_password = os.getenv('MONGO_PASS', 'pass'),其中pass是默认值,如果没有设置MONGO_PASS env var。我尝试了一个基于os.Getenv为空的if语句,但由于if语句中变量赋值的作用域,这似乎不起作用。而且我正在检查多个env var,所以我不能在if语句中处理此信息。
mongo_password = os.getenv('MONGO_PASS', 'pass')
pass
MONGO_PASS
os.Getenv
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:
os.LookupEnv
func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback }
型
vddsk6oq2#
您要查找的是os.LookupEnv与if语句的组合。以下是janos更新后使用LookupEnv的答案:
if
func getEnv(key, fallback string) string { value, exists := os.LookupEnv(key) if !exists { value = fallback } return value }
字符串
o4tp2gmn3#
Go在这里没有与Python完全相同的功能;不过,我能想到的最惯用的方法是:
mongo_password := "pass" if mp := os.Getenv("MONGO_PASS"); mp != "" { mongo_password = mp }
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 }
wljmcqd85#
和OP有同样的问题,发现有人把这个线程的答案封装到一个相当简单易用的漂亮库中,希望这对其他人有帮助!https://github.com/caarlos0/env
wwodge7n6#
对于更复杂的应用程序,您可以使用工具,如viper,它允许您设置全局自定义默认值,解析配置文件,为应用程序的env var键设置前缀(以确保env var配置的一致性和名称间距)以及许多其他很酷的功能。示例代码:
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) }
xoefb8l87#
我也遇到了同样的问题,我只是创建了一个名为getenvs的小软件包来解决这个问题。Getenvs支持string,bool,int和float,它可以像下面这样使用:
string
bool
int
float
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) }
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) }
8条答案
按热度按时间jdzmm42g1#
没有内置的回退到默认值,所以你必须做一个很好的老式的if-else。
但是你总是可以创建一个helper函数来使其更容易:
字符串
请注意,正如@ michael-hausengland在评论中指出的那样,请记住,如果环境变量的值真的为空,您将获得回退值。
更好的是,正如@ KokaszWojciechowski指出的那样,使用
os.LookupEnv
:型
vddsk6oq2#
您要查找的是
os.LookupEnv
与if
语句的组合。以下是janos更新后使用LookupEnv的答案:
字符串
o4tp2gmn3#
Go在这里没有与Python完全相同的功能;不过,我能想到的最惯用的方法是:
字符串
jljoyd4f4#
为了有一个干净的代码,我这样做:
字符串
我定义了一个在整个应用中使用的函数
型
wljmcqd85#
和OP有同样的问题,发现有人把这个线程的答案封装到一个相当简单易用的漂亮库中,希望这对其他人有帮助!
https://github.com/caarlos0/env
wwodge7n6#
对于更复杂的应用程序,您可以使用工具,如
viper
,它允许您设置全局自定义默认值,解析配置文件,为应用程序的env var键设置前缀(以确保env var配置的一致性和名称间距)以及许多其他很酷的功能。示例代码:
字符串
xoefb8l87#
我也遇到了同样的问题,我只是创建了一个名为getenvs的小软件包来解决这个问题。
Getenvs支持
string
,bool
,int
和float
,它可以像下面这样使用:字符串
7tofc5zh8#
如果您不介意添加一些依赖项,则可以使用类似https://github.com/urfave/cli的东西
字符串