web-dev-qa-db-fra.com

Golang - Comment attribuer une valeur par défaut si env var est vide?

Dans golang, comment attribuez-vous une valeur par défaut si une variable d'environnement n'est pas définie? 

En python, je pourrais faire mongo_password = os.getenv('MONGO_PASS', 'pass'), où pass est la valeur par défaut si MONGO_PASSvar var n'est pas défini.

J'ai essayé une instruction if basée sur os.Getenv étant vide, mais cela ne semble pas fonctionner en raison de la portée de l'affectation de variable dans une instruction if. Et je vérifie la présence de plusieurs variables env, je ne peux donc pas agir sur ces informations dans l'instruction if.

26
Ryan Clair

Il n'y a pas d'intégré pour revenir à une valeur par défaut, Vous devez donc faire un bon vieux jeu si.

Mais vous pouvez toujours créer une fonction d'assistance pour rendre cela plus facile:

func getenv(key, fallback string) string {
    value := os.Getenv(key)
    if len(value) == 0 {
        return fallback
    }
    return value
}

Notez que, comme le fait remarquer @ michael-hausenblas dans un commentaire, , Gardez à l'esprit que si la valeur de la variable d'environnement est vraiment vide, vous obtiendrez la valeur de repli.

Encore mieux comme @ ŁukaszWojciechowski a souligné, en utilisant os.LookupEnv :

func getEnv(key, fallback string) string {
    if value, ok := os.LookupEnv(key); ok {
        return value
    }
    return fallback
}
46
janos

Ce que vous cherchez, c'est os.LookupEnv combiné avec une instruction if.

Voici la réponse de janos mise à jour pour utiliser LookupEnv:

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

Go n'a pas exactement les mêmes fonctionnalités que Python ici; La façon la plus idiomatique de le faire, cependant, est la suivante:

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

Si vous aviez la même question que le PO et que quelqu'un avait résumé les réponses de ce fil dans une bibliothèque astucieuse assez simple à utiliser, espérons que cela aidera les autres!

https://github.com/caarlos0/env

1
Jaime Gago

Pour avoir un code propre, je fais ceci:

myVar := getEnv("MONGO_PASS", "default-pass")

J'ai défini une fonction utilisée dans l'ensemble de l'application

// 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
}
1
Eddy Hernandez

Si vous voulez ajouter de petites dépendances, vous pouvez utiliser quelque chose comme 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)
}
0
Oleg Neumyvakin