Как работать с переменными окружения в Go и каковы лучшие практики их использования?

Ответ

Работа с переменными окружения — ключевой аспект методологии The Twelve-Factor App, которая предписывает хранить конфигурацию в среде, а не в коде.

1. Работа через стандартную библиотеку os

Пакет os предоставляет основные функции для чтения переменных окружения.

import (
    "fmt"
    "os"
)

func main() {
    // Получение значения. Возвращает пустую строку, если переменная не задана.
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080" // Значение по умолчанию
    }
    fmt.Println("Port:", port)

    // Более идиоматичный способ с проверкой существования переменной
    apiKey, ok := os.LookupEnv("API_KEY")
    if !ok {
        fmt.Println("API_KEY is not set!")
    } else {
        fmt.Println("API_KEY:", apiKey)
    }
}

2. Локальная разработка: .env файлы

Для удобства локальной разработки часто используют .env файлы. Популярная библиотека для этого — github.com/joho/godotenv.

Файл .env:

PORT=3000
API_KEY=my-secret-key

Код на Go:

import (
    "log"
    "github.com/joho/godotenv"
)

func init() {
    // Загружаем переменные из .env файла в окружение
    // В продакшене этот вызов можно пропустить, т.к. переменные будут в среде
    if err := godotenv.Load(); err != nil {
        log.Println("No .env file found")
    }
}

3. Лучшие практики и Production

  • Никогда не храните секреты в коде. Пароли, токены, ключи API должны передаваться только через переменные окружения.
  • Добавляйте .env в .gitignore, чтобы случайно не закоммитить секреты в репозиторий. Храните в репозитории только пример (.env.example).
  • В Production используйте системы управления секретами, которые предоставляет ваша платформа:
    • Kubernetes: Secrets и ConfigMaps.
    • Docker: Docker Secrets.
    • Облачные провайдеры: AWS Secrets Manager, Google Secret Manager, Azure Key Vault.
    • Специализированные инструменты: HashiCorp Vault.