Формат файла
Библиотека env поддерживает несколько конфигурационных форматов: .env, JSON и YAML.
Формат .env
Базовый синтаксис
# Комментарии
KEY=value
# Знак равенства в значении
URL=https://example.com?foo=bar
# Пустые строки игнорируются
# Недопустимо: ключ не может содержать пробелы
# MY KEY=valueКавычки
# Двойные кавычки: сохраняют пробелы, поддерживают экранирование
MESSAGE="Hello World"
PATH="/usr/local/bin"
# Одинарные кавычки: без обработки экранирования (буквально сохраняются последовательности с обратной косой чертой)
# Внимание: одинарные кавычки не блокируют подстановку переменных — она выполняется единообразно после снятия кавычек
LITERAL='no escaping here: \n stays literal'
# Без кавычек
SIMPLE=value
# Пустое значение
EMPTY=
EMPTY=""
EMPTY=''Управляющие символы
Экранирование поддерживается в двойных кавычках:
# Перевод строки
MULTILINE="line1\nline2"
# Табуляция
TABBED="col1\tcol2"
# Кавычки
QUOTED="He said \"Hello\""
# Обратная косая черта
PATH="C:\\Users\\name"
# Знак доллара
PRICE="Price: \$100"Подстановка переменных
Поддерживается при включённом ExpandVariables:
# Ссылка на другие переменные
BASE_URL=https://api.example.com
API_URL=${BASE_URL}/v1
# Краткий синтаксис
URL=$BASE_URL/path
# Значения по умолчанию
HOST=${HOST:-localhost}
PORT=${PORT:-8080}
# Вложенная подстановка
SERVICE=${CLUSTER:-default}-${REGION:-us-east}Синтаксис export
Поддерживается при включённом AllowExportPrefix:
# Экспорт в стиле Bash
export KEY=value
export ANOTHER="quoted value"Стиль YAML
Поддерживается при включённом AllowYamlSyntax:
# Пары ключ-значение в стиле YAML
KEY: value
ANOTHER: "quoted value"Многострочные значения
Парсер .env сканирует построчно, каждая строка разбирается независимо, значения в кавычках, пересекающие несколько строк, не поддерживаются — значение в двойных кавычках должно быть замкнуто в пределах одной строки, иначе возвращается ErrInvalidValue. Для перевода строки используйте escape-последовательность \n (действует только в двойных кавычках; одинарные кавычки не обрабатывают экранирование):
# \n внутри двойных кавычек преобразуется в символ перевода строки
LINES="line1\nline2\nline3"
# Фактическое значение состоит из трёх строк: line1 / line2 / line3
# Многострочные сертификаты наподобие PRIVATE_KEY рекомендуется собирать через \n
PRIVATE_KEY="-----BEGIN KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END KEY-----"Если нужны настоящие многострочные строки, используйте формат JSON или YAML или расширьте поддержку многострочности через пользовательский парсер.
Формат JSON
Базовая структура
{
"APP_NAME": "my-app",
"APP_VERSION": "1.0.0",
"DEBUG": true,
"PORT": 8080
}Вложенные объекты
Вложенные объекты преобразуются в плоский вид:
{
"database": {
"host": "localhost",
"port": 5432
}
}Результат:
DATABASE_HOST=localhost
DATABASE_PORT=5432Массивы
Массивы преобразуются в ключи с индексом:
{
"ALLOWED_HOSTS": ["localhost", "example.com"],
"PORTS": [80, 443, 8080]
}Результат:
ALLOWED_HOSTS_0=localhost
ALLOWED_HOSTS_1=example.com
PORTS_0=80
PORTS_1=443
PORTS_2=8080Доступ к элементам массива
Используйте функцию GetSlice[T] или точечный путь для доступа к индексированным ключам:
hosts := env.GetSlice[string]("ALLOWED_HOSTS")
port0 := env.GetInt("PORTS_0") // 80Подробнее см. Документацию GetSlice.
Параметры преобразования типов
cfg := env.DefaultConfig()
// null преобразуется в пустую строку
cfg.JSONNullAsEmpty = true
// Числа преобразуются в строки
cfg.JSONNumberAsString = true
// Логические значения преобразуются в строки
cfg.JSONBoolAsString = trueОграничение глубины
cfg.JSONMaxDepth = 10 // Максимальная глубина вложенностиФормат YAML
Базовая структура
APP_NAME: my-app
APP_VERSION: "1.0.0"
DEBUG: true
PORT: 8080Вложенные структуры
database:
host: localhost
port: 5432
credentials:
user: admin
password: secretРезультат преобразования в плоский вид:
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_CREDENTIALS_USER=admin
DATABASE_CREDENTIALS_PASSWORD=secretСписки
Списки преобразуются в ключи с индексом:
allowed_hosts:
- localhost
- example.com
- api.example.comРезультат:
ALLOWED_HOSTS_0=localhost
ALLOWED_HOSTS_1=example.com
ALLOWED_HOSTS_2=api.example.comМногострочные строки
Внимание
Блочные скаляры YAML (литеральный блок | и свёрнутый блок >) в настоящее время не поддерживаются. Парсер сохраняет |/> как обычные скалярные символы, а последующие строки с отступом нарушат разбор пар ключ-значение.
Для значений, в которых нужно сохранить перевод строки, используйте двойные кавычки с escape-последовательностью \n:
description: "Line1\nLine2\nLine3"Либо расширьте поддержку блочных скаляров через пользовательский парсер.
Параметры преобразования типов
cfg := env.DefaultConfig()
cfg.YAMLNullAsEmpty = true
cfg.YAMLNumberAsString = true
cfg.YAMLBoolAsString = true
cfg.YAMLMaxDepth = 10Определение формата
Автоматическое определение
// Определение по расширению файла
format := env.DetectFormat("config.json") // FormatJSON
format = env.DetectFormat("settings.yaml") // FormatYAML
format = env.DetectFormat(".env") // FormatEnv
// При отсутствии подходящего расширения возвращается FormatAuto (по умолчанию используется парсер .env)
format = env.DetectFormat("config") // FormatAutoКонстанты форматов
const (
FormatAuto FileFormat = iota // Автоматическое определение
FormatEnv // Формат .env
FormatJSON // Формат JSON
FormatYAML // Формат YAML
)Строковое представление формата
format := env.FormatJSON
fmt.Println(format.String()) // Вывод: jsonЛучшие практики
Выбор формата
| Сценарий | Рекомендуемый формат |
|---|---|
| Простая конфигурация | .env |
| Сложная вложенная конфигурация | JSON или YAML |
| Совместное использование с другими инструментами | JSON |
| Приоритет читаемости | YAML |
| Окружение Docker/K8s | .env |
Именование файлов
.env # Конфигурация по умолчанию
.env.local # Локальные переопределения (не коммитить)
.env.development # Среда разработки
.env.staging # Предпродуктивная среда
.env.production # Производственная среда
.env.test # Тестовая средаСмешанное использование
// Можно смешивать разные форматы
loader.LoadFiles(
"base.env", // Базовая конфигурация
"database.json", // Конфигурация базы данных
"secrets.yaml", // Конфиденциальная конфигурация
".env.local", // Локальные переопределения
)Игнорирование в Git
# Игнорировать конфиденциальную конфигурацию
.env.local
.env.*.local
.env.production
secrets.yaml
# Сохранить шаблон
!.env.exampleСвязанная документация
- Мультиформатная конфигурация - Руководство по загрузке нескольких форматов
- ComponentFactory API - Справка по функции DetectFormat
- Config API - Параметры парсинга JSON/YAML