如果未在Go中设置环境变量,如何分配默认值?
在Python中mongo_password = os.getenv('MONGO_PASS', 'pass')
,pass
如果MONGO_PASS
未设置env var,我可以在哪里设置默认值。
我尝试了基于os.Getenv
空的if语句,但是由于if语句中变量赋值的范围,这似乎不起作用。而且我正在检查多个env var,因此无法在if语句中对这些信息进行操作。
如果未在Go中设置环境变量,如何分配默认值?
在Python中mongo_password = os.getenv('MONGO_PASS', 'pass')
,pass
如果MONGO_PASS
未设置env var,我可以在哪里设置默认值。
我尝试了基于os.Getenv
空的if语句,但是由于if语句中变量赋值的范围,这似乎不起作用。而且我正在检查多个env var,因此无法在if语句中对这些信息进行操作。
./server.go:63: mpass declared and not used
=
,而不是:=
在mpass
该范围内if
声明。感谢您叫我Volker :-)
Answers:
没有内置函数可以还原为默认值,因此您必须执行良好的老式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
}
value
而空字符串的""
长度为0,这意味着当将env变量设置为""
您时,将得到后备/默认值,而不是比值(微不足道""
)。确实取决于您的用例,但是我认为值得指出,因为我曾经遇到过这种语义错误并
Getenv
您可以使用LookupEnv
。它还返回ok boolean
该值确实存在的状态。
您要查找的内容os.LookupEnv
与if
声明结合在一起。
这是janos的答案更新为使用LookupEnv:
func getEnv(key, fallback string) string {
value, exists := os.LookupEnv(key)
if !exists {
value = fallback
}
return value
}
Go此处的功能与Python不完全相同;我可以想到,最惯用的方法是:
mongo_password := "pass"
if mp := os.Getenv("MONGO_PASS"); mp != "" {
mongo_password = mp
}
mongo_password := "pass"
是必不可少的,因为使用此行mongo_password
进行了声明和定义(设置pass
为默认值)。如果您没有那条线,那么我可以想象出一个错误。在上述情况下,仅FWIWmp
的本地范围if
。
为了获得干净的代码,我这样做:
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
}
如果您可以添加很少的依赖关系,可以使用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)
}
对于更复杂的应用程序,您可以使用诸如之类的工具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)
}
if
做的工作。