Ответ
Работа с переменными окружения — ключевой аспект методологии 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.
- Kubernetes: