Wie weisen Sie einen Standardwert zu, wenn in Go keine Umgebungsvariable festgelegt ist?
In Python könnte ich tun, mongo_password = os.getenv('MONGO_PASS', 'pass')
wo pass
der Standardwert ist, wenn MONGO_PASS
env var nicht gesetzt ist.
Ich habe eine if-Anweisung versucht, die darauf basiert os.Getenv
, leer zu sein, aber das scheint aufgrund des Umfangs der Variablenzuweisung innerhalb einer if-Anweisung nicht zu funktionieren. Und ich suche nach mehreren env-Variablen, sodass ich in der if-Anweisung nicht auf diese Informationen reagieren kann.
go
environment-variables
Ryan Clair
quelle
quelle
if
funktioniert ../server.go:63: mpass declared and not used
=
statt:=
auf diempass
in derif
Erklärung. Danke, dass du mich Volker angerufen hast :-)Antworten:
Es gibt keine eingebaute Funktion, um auf einen Standardwert zurückzugreifen. Sie müssen also ein gutes altmodisches If-else ausführen.
Sie können jedoch jederzeit eine Hilfsfunktion erstellen, um dies zu vereinfachen:
func getenv(key, fallback string) string { value := os.Getenv(key) if len(value) == 0 { return fallback } return value }
Beachten Sie, dass Sie, wie @ michael-hausenblas in einem Kommentar hervorhob , bedenken, dass Sie stattdessen den Fallback-Wert erhalten, wenn der Wert der Umgebungsvariablen wirklich leer ist.
Noch besser, wie @ ŁukaszWojciechowski betonte
os.LookupEnv
:func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback }
quelle
value
und die leere Zeichenfolge""
die Länge 0 hat, bedeutet dies, dass Sie, wenn die env-Variable auf gesetzt ist,""
eher den Fallback- / Standardwert erhalten als der Wert (der trivial ist""
). Kommt wirklich auf deinen Anwendungsfall an, aber ich dachte, es lohnt sich darauf hinzuweisen, da ich einmal auf diesen semantischen FehlerGetenv
Ihnen könnte verwendenLookupEnv
. Es gibt auch denok boolean
Status zurück, dass der Wert tatsächlich vorhanden war.Was Sie suchen, wird
os.LookupEnv
mit einerif
Aussage kombiniert .Hier ist die Antwort von Janos, die aktualisiert wurde, um LookupEnv zu verwenden:
func getEnv(key, fallback string) string { value, exists := os.LookupEnv(key) if !exists { value = fallback } return value }
quelle
Go hat hier nicht genau die gleiche Funktionalität wie Python. Der idiomatischste Weg, dies zu tun, ist:
mongo_password := "pass" if mp := os.Getenv("MONGO_PASS"); mp != "" { mongo_password = mp }
quelle
mongo_password := "pass"
wichtig ist, da hiermitmongo_password
deklariert und definiert wird (pass
als Standardwert festgelegt). Wenn Sie diese Zeile nicht haben, kann ich mir einen Fehler vorstellen. In unserem obigen Fall hat nurmp
der lokale Geltungsbereich desif
FWIW.Um einen sauberen Code zu haben, mache ich Folgendes:
myVar := getEnv("MONGO_PASS", "default-pass")
Ich habe eine Funktion definiert, die in der gesamten App verwendet wird
// 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 }
quelle
Hatte die gleiche Frage wie das OP und fand jemanden, der die Antworten aus diesem Thread in einer raffinierten Bibliothek zusammengefasst hat, die ziemlich einfach zu bedienen ist. Ich hoffe, dies hilft anderen!
https://github.com/caarlos0/env
quelle
Wenn Sie mit dem Hinzufügen einer geringen Abhängigkeit einverstanden sind, können Sie beispielsweise https://github.com/urfave/cli verwenden
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) }
quelle
Für komplexere Anwendungen können Sie Tools verwenden
viper
, mit denen Sie globale benutzerdefinierte Standardwerte festlegen, Konfigurationsdateien analysieren, ein Präfix für die env var-Schlüssel Ihrer App festlegen (um die Konsistenz und den Namensabstand der env var-Konfigurationen sicherzustellen) und viele andere coole Funktionen verwenden können Eigenschaften.Beispielcode:
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) }
quelle