Ответ
Управление конфигурацией в зависимости от окружения — ключевая задача в разработке бэкенда. В Go для этого есть несколько стандартных подходов:
-
Переменные окружения (Environment Variables) Это самый распространенный и гибкий способ, соответствующий принципам 12-factor app. Приложение читает конфигурацию из переменных окружения при старте.
- Чтение: Используется пакет
os
(os.Getenv("VAR_NAME")
). - Пример:
dbHost := os.Getenv("DB_HOST") if dbHost == "" { dbHost = "localhost" // Значение по умолчанию }
- Библиотеки: Для удобной загрузки переменных из
.env
файлов на этапе разработки часто используют библиотеки, например,github.com/joho/godotenv
.
- Чтение: Используется пакет
-
Флаги командной строки (Command-line Flags) Позволяют передавать параметры конфигурации непосредственно при запуске приложения. Удобно для переопределения отдельных значений.
- Реализация: Используется стандартный пакет
flag
. - Пример:
port := flag.String("port", "8080", "port to run the server on") flag.Parse() fmt.Println("Starting server on port:", *port)
- Реализация: Используется стандартный пакет
-
Конфигурационные файлы (JSON, YAML, TOML) Подходят для сложных конфигураций. Файл с настройками (например,
config.yaml
) загружается и парсится при старте приложения.- Библиотеки: Для работы с конфигурационными файлами часто используют сторонние библиотеки, которые умеют совмещать несколько источников (файлы, env, флаги). Самая популярная —
github.com/spf13/viper
.
- Библиотеки: Для работы с конфигурационными файлами часто используют сторонние библиотеки, которые умеют совмещать несколько источников (файлы, env, флаги). Самая популярная —
Рекомендуемый подход:
Использовать комбинацию методов. Основная конфигурация хранится в файлах (например, config.yaml
), а чувствительные данные (пароли, токены) и параметры, зависящие от окружения (адрес БД, порт), передаются через переменные окружения. Флаги командной строки используются для временного переопределения настроек при запуске.