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

Dans golang, comment affecter une valeur par défaut si la variable d'environnement n'est pas définie?

en python je pourrais faire mongo_password = os.getenv('MONGO_PASS', 'pass')pass est la valeur par défaut si MONGO_PASS env var n'est pas prêt.

j'ai essayé une instruction if basé sur os.Getenv être vide, mais cela ne semble pas fonctionner en raison de la portée de la variable assignment à l'intérieur d'une instruction if. Et je vérifie qu'il y a plusieurs env var, donc je ne peux pas agir sur cette information dans la déclaration de si.

19
demandé sur Ryan Clair 2016-10-30 09:21:43

6 réponses

il n'y a pas de valeur intégrée pour revenir à une valeur par défaut, donc tu dois faire un bon vieux SI - AUTREMENT.

mais vous pouvez toujours créer une fonction helper pour faciliter cela:

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

Notez que @michael-hausenblas souligné dans un commentaire, gardez à l'esprit que si la valeur de la variable d'environnement est vraiment vide, vous obtiendrez la valeur de secours à la place.

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

func getEnv(key, fallback string) string {
    if value, ok := os.LookupEnv(key); ok {
        return value
    }
    return fallback
}
34
répondu janos 2017-08-31 12:47:48

Ce que vous cherchez est os.LookupEnv combiné avec un if déclaration.

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
}
15
répondu puradox 2018-01-04 13:15:12

Go n'a pas exactement la même fonctionnalité que Python ici; la façon la plus idiomatique de le faire cependant, je peux penser, est:

mongo_password := "pass"
if mp := os.Getenv("MONGO_PASS"); mp != "" {
    mongo_password = mp
}
2
répondu Michael Hausenblas 2016-10-30 06:41:08

j'ai ajouté une fonction supplémentaire pour avoir du code plus propre

// 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
}

Et dans le flux principal

myVar := getEnv("MONGO_PASS", "default-pass")
1
répondu Eddy Hernandez 2017-06-22 17:58:57

dans le cas où vous êtes D'accord avec l'ajout d'une petite dépendance, 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
répondu Oleg Neumyvakin 2016-10-30 06:32:43

avait la même question que L'OP et a trouvé quelqu'un encapsulé les réponses de ce fil dans une bibliothèque astucieuse qui est assez simple à utiliser, espérons que cela aide les autres!

https://github.com/caarlos0/env

0
répondu Jaime Gago 2018-05-22 22:14:18