Переменные окружения
Переопределяйте конфигурацию из окружения
«Переменные окружения» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Зачем нужны переменные окружения
Методология Twelve-Factor App рекомендует хранить конфигурацию в окружении. Переменные окружения позволяют одному и тому же двоичному файлу работать по-разному в средах разработки, тестирования и эксплуатации без изменения файлов.
Viper может накладывать переменные окружения поверх конфигурации из файла.
Порядок приоритета
Viper разрешает ключ, проверяя источники в порядке приоритета — от самого высокого к самому низкому:
- явные вызовы
Set - флаги
- переменные окружения
- файл конфигурации
- значения по умолчанию
Таким образом, переменная окружения переопределяет файл, но имеет более низкий приоритет, чем явный вызов Set.
Включение поддержки переменных окружения
viper.AutomaticEnv() сообщает Viper, что нужно проверять переменные окружения для любого запрошенного ключа. После этого viper.GetString("port") будет искать переменную окружения PORT.
viper.AutomaticEnv()
port := viper.GetString("port")Добавление префикса
Чтобы избежать конфликтов с несвязанными переменными окружения, задайте префикс:
viper.SetEnvPrefix("myapp")- Теперь ключ
portсоответствует переменной окруженияMYAPP_PORT
Viper переводит ключ в верхний регистр и добавляет перед ним префикс с символом подчёркивания.
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetString("port")) // reads MYAPP_PORTРабота с вложенными ключами
Переменные окружения не могут содержать точки. Используйте замену ключей, чтобы преобразовать точки во вложенных ключах в символы подчёркивания: server.port станет SERVER_PORT.
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
// server.port -> SERVER_PORTПривязка одной переменной
Вместо автоматического режима можно явно связать один ключ с помощью viper.BindEnv. Это удобно, когда имя переменной окружения не соответствует соглашению о префиксе.
viper.BindEnv("id", "ACCOUNT_ID")
fmt.Println(viper.GetString("id"))Пакет os стандартной библиотеки
Внутри это выполняет чтение из окружения процесса, доступное в стандартной библиотеке через os.Getenv и os.LookupEnv.
os.Getenvвозвращает пустую строку, если переменная не заданаos.LookupEnvвозвращает второе логическое значение, сообщающее, присутствовала ли переменная
val, ok := os.LookupEnv("PORT")
if !ok {
val = "8080" // default
}Установка переменных окружения в Go
Можно программно задавать переменные окружения для тестов или значений по умолчанию с помощью os.Setenv. Именно это мы используем далее, чтобы показать поведение переопределения.
os.Setenv("MYAPP_PORT", "9090")Пустое значение и отсутствие переменной
Будьте внимательны: переменная окружения, установленная в пустую строку, всё равно считается присутствующей. os.LookupEnv возвращает ("", true). Если использовать только os.Getenv, невозможно отличить пустое значение от отсутствующей переменной, что важно для флагов, подобных логическим.
os.Setenv("FEATURE", "")
v, ok := os.LookupEnv("FEATURE")
fmt.Println(v == "", ok) // true trueОбъединяем всё (концепция)
Типичный процесс запуска: считайте файл со значениями по умолчанию, затем вызовите AutomaticEnv, чтобы переменные окружения развёртывания имели приоритет. Специалисты по эксплуатации могут изменить MYAPP_PORT, не затрагивая YAML.
viper.SetConfigName("config")
viper.ReadInConfig()
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetInt("port"))Рабочий пример: переопределение через окружение
Эта программа на стандартной библиотеке имитирует приоритет Viper: значение по умолчанию из файла переопределяется окружением.
package main
import (
"fmt"
"os"
)
func get(key, fileDefault string) string {
if v, ok := os.LookupEnv(key); ok {
return v
}
return fileDefault
}
func main() {
os.Setenv("PORT", "9090")
fmt.Println("port:", get("PORT", "8080"))
fmt.Println("host:", get("HOST", "localhost"))
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли настройку переменных окружения.
Итоги
Вы научились переопределять конфигурацию из окружения:
- Переменные окружения имеют высокий приоритет в Viper и превосходят файл
AutomaticEnvвместе сSetEnvPrefixсопоставляют ключи с переменными видаPREFIX_KEY- Используйте
SetEnvKeyReplacerдля вложенных ключей с точками - Стандартная библиотека обеспечивает эту возможность с помощью
os.Getenv/os.LookupEnv
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Переменные окружения» бесплатный?
Да — полный текст урока «Переменные окружения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Переменные окружения»?
Переопределяйте конфигурацию из окружения Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Переменные окружения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение конфигурационных файлов
- Переменные окружения
- Значения по умолчанию и отслеживание
- Привязка к структурам