Пакет Golang envconfig
Пакет envconfig
в Go предназначен для удобной загрузки переменных окружения в структуры. Это популярный инструмент, который позволяет легко маппить переменные окружения на заранее определённые поля структуры и упрощает управление конфигурацией приложения.
Основные возможности envconfig
:
- Загрузка переменных окружения в структуры.
- Автоматически преобразует переменные окружения в нужные типы.
- Работает с примитивами (
string
,int
,float64
,bool
) и даже сложными типами (slices
).
- Поддержка тегов.
- Поля структуры могут использовать теги
env
для указания соответствующих имен переменных окружения. - Поддерживает дефолтные значения через теги
default
.
- Поля структуры могут использовать теги
- Валидация и обработка ошибок.
- Если переменная отсутствует, но обязательна,
envconfig
возвращает ошибку.
- Если переменная отсутствует, но обязательна,
- Префикс для группировки переменных.
- Можно задать общий префикс для всех переменных окружения, чтобы разделять конфигурации.
- Удобство и минимальный код.
- Простая настройка без дополнительного кода для загрузки и парсинга переменных.
Установка:
1 2 |
go get github.com/kelseyhightower/envconfig |
Пример использования:
1. Базовый пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package main import ( "fmt" "log" "github.com/kelseyhightower/envconfig" ) // Определяем структуру конфигурации type Config struct { Port int `env:"APP_PORT" default:"8080"` // Значение по умолчанию Environment string `env:"APP_ENV"` // Переменная окружения Debug bool `env:"APP_DEBUG" default:"false"` // Булевое значение } func main() { var cfg Config // Загружаем конфигурацию из переменных окружения err := envconfig.Process("", &cfg) if err != nil { log.Fatalf("Ошибка загрузки конфигурации: %s", err) } // Вывод конфигурации fmt.Printf("Config: %+v\n", cfg) } |
Запуск с переменными окружения:
1 2 |
APP_PORT=3000 APP_ENV=production APP_DEBUG=true go run main.go |
Вывод:
1 2 |
Config: {Port:3000 Environment:production Debug:true} |
2. Пример с префиксом:
Префикс позволяет группировать связанные переменные окружения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "fmt" "log" "github.com/kelseyhightower/envconfig" ) type Config struct { Host string `env:"HOST"` Port int `env:"PORT" default:"5432"` } func main() { var cfg Config // Используем префикс APP для переменных окружения err := envconfig.Process("APP", &cfg) if err != nil { log.Fatalf("Ошибка загрузки конфигурации: %s", err) } fmt.Printf("Config: %+v\n", cfg) } |
Переменные окружения:
1 2 |
APP_HOST=localhost APP_PORT=3000 go run main.go |
Вывод:
1 2 |
Config: {Host:localhost Port:3000} |
3. Список переменных окружения:
envconfig
позволяет выводить все переменные окружения, которые нужны приложению.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package main import ( "log" "os" "github.com/kelseyhightower/envconfig" ) type Config struct { APIKey string `env:"API_KEY" required:"true"` Debug bool `env:"DEBUG" default:"false"` } func main() { var cfg Config err := envconfig.Usage("MYAPP", &cfg) if err != nil { log.Fatal(err) os.Exit(1) } } |
Вывод:
1 2 3 |
MYAPP_API_KEY [required] (string) MYAPP_DEBUG [default: false] (bool) |
4. Пример со слайсами:
Пакет поддерживает парсинг слайсов из строк через запятые.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type Config struct { Hosts []string `env:"HOSTS"` } func main() { var cfg Config err := envconfig.Process("", &cfg) if err != nil { log.Fatal(err) } fmt.Printf("Hosts: %+v\n", cfg.Hosts) } |
Переменная окружения:
1 2 |
HOSTS=host1,host2,host3 |
Вывод:
1 2 |
Hosts: [host1 host2 host3] |
Полезные функции в envconfig
:
envconfig.Process(prefix string, spec interface{}) error
- Загружает переменные окружения в переданную структуру.
envconfig.Usage(prefix string, spec interface{}) error
- Выводит список всех ожидаемых переменных окружения с их описанием.
envconfig.MustProcess(prefix string, spec interface{})
- То же, что и
Process
, но завершает работу программы, если возникает ошибка.
- То же, что и
Особенности и преимущества:
- Удобная поддержка тегов:
env
: имя переменной окружения.default
: значение по умолчанию.required
: отмечает переменную как обязательную.
- Простое преобразование типов:
- Примитивы (строки, числа, булевы значения).
- Сложные структуры (слайсы, массивы).
- Подходит для приложений, следующих 12-факторным принципам.
Когда использовать?
- Для приложений, которые полагаются на конфигурации через переменные окружения.
- Для работы с Docker/Kubernetes, где переменные окружения широко используются.
- Когда нужно минимизировать ручной код для работы с конфигурациями.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024