在Gio中,如果没有设置环境变量,如何分配默认值?
在Python中我可以mongo_password = os.getenv('MONGO_PASS', 'pass')
pass
,如果MONGO_PASS
env var未设置,则os.Getenv
是默认值。
我尝试了基于val csv = sqlContext.sparkContext.textFile(csvPath).map {
case(txt) =>
try {
val reader = new CSVReader(new StringReader(txt), delimiter, quote, escape, headerLines)
val parsedRow = reader.readNext()
Row(mapSchema(parsedRow, schema) : _*)
} catch {
case e: IllegalArgumentException => throw new UnsupportedOperationException("converted from Arg to Op except")
}
}
为空的if语句,但由于if语句中的变量赋值范围,这似乎不起作用。我正在检查多个env var,因此我无法在if语句中对此信息进行操作。
答案 0 :(得分:55)
没有内置功能可以回退到默认值, 所以你必须做一个老式的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
}
答案 1 :(得分:19)
您正在寻找的是os.LookupEnv
和if
声明。
以下是janos的答案更新后使用LookupEnv:
func getEnv(key, fallback string) string {
value, exists := os.LookupEnv(key)
if !exists {
value = fallback
}
return value
}
答案 2 :(得分:5)
Go在这里没有与Python完全相同的功能;我能想到的最常用的方法是:
mongo_password := "pass"
if mp := os.Getenv("MONGO_PASS"); mp != "" {
mongo_password = mp
}
答案 3 :(得分:2)
要使用干净的代码,我会这样做:
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
}
答案 4 :(得分:2)
与OP有同样的问题,发现有人将这个帖子的答案封装成一个相当简单易用的漂亮的库,希望这有助于其他人!
答案 5 :(得分:0)
如果您可以添加少量依赖项,则可以使用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)
}
答案 6 :(得分: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)
}
答案 7 :(得分:0)
我也遇到了同样的问题,我刚刚创建了一个名为 getenvs 的小包来解决这个问题。
Getenvs 支持 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)
}