Как назначить значение по умолчанию, если env var пуст?

Как назначить значение по умолчанию, если переменная окружения не установлена в Go?

В Python я мог сделать mongo_password = os.getenv('MONGO_PASS', 'pass'), где pass является значением по умолчанию, если MONGO_PASS env var не установлен.

Я пробовал оператор if, основанный на том, что os.Getenv пуст, но, похоже, это не работает из-за объема присваивания переменных внутри оператора if. И я проверяю наличие нескольких env var, поэтому я не могу использовать эту информацию в операторе if.

Ответ 1

Нет встроенного, чтобы вернуться к значению по умолчанию, так что вам нужно сделать добрый старомодный 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
}

Ответ 2

Что вам нужно, так это os.LookupEnv сочетании с оператором if.

Вот ответ от janos, обновленный для использования LookupEnv:

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

Ответ 3

Go не имеет такой же функциональности, как Python; самый идиоматический способ сделать это, хотя, я могу думать, есть:

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

Ответ 4

Чтобы иметь чистый код, я делаю это:

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
}

Ответ 5

У него был тот же вопрос, что и у ОП, и он нашел, что кто-то заключил ответы из этой темы в изящную библиотеку, довольно простую в использовании, надеюсь, это поможет другим!

https://github.com/caarlos0/env

Ответ 6

Если у вас все в порядке с добавлением небольшой зависимости, вы можете использовать что-то вроде 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)
}