Как в Go-проектах принято управлять различными окружениями (development, staging, production)?

Ответ

Управление конфигурацией для разных окружений — ключевая задача в разработке. В Go для этого используют несколько подходов:

  1. Переменные окружения: Самый простой и популярный способ, соответствующий принципам 12-factor app. Для чтения используется стандартный пакет os.

    // Пример чтения переменной окружения с fallback-значением
    dbHost := os.Getenv("DB_HOST")
    if dbHost == "" {
        dbHost = "localhost" // Значение по умолчанию для dev-окружения
    }
  2. Файлы .env: Для удобства локальной разработки переменные окружения хранят в .env файлах и загружают их с помощью библиотек, например, github.com/joho/godotenv.

  3. Конфигурационные файлы (YAML, JSON, TOML): Для сложных конфигураций используют файлы. Популярная библиотека github.com/spf13/viper умеет читать конфиги из файлов, переменных окружения, флагов и удаленных хранилищ (etcd, Consul), что делает ее очень гибкой.

  4. Флаги командной строки: Для простых переключателей (например, -env=production) используется стандартный пакет flag.

Лучшая практика: Комбинировать подходы. Например, использовать Viper для чтения конфигурации из файла (config.yaml), но позволять переопределять любые параметры через переменные окружения. Это обеспечивает гибкость как для локальной разработки, так и для развертывания в Docker/Kubernetes, где управление через переменные окружения является стандартом.