Любое серьёзное приложение должно уметь гибко настраиваться. Жёстко зашивать в код параметры (API-ключи, секреты, пути) — плохая практика: секреты утекут в Git, а для изменения настроек придётся пересобирать программу. На этом этапе мы создадим систему конфигурации, которая читает все настройки из внешнего YAML-файла.
— формат хранения настроек, удобный для чтения и редактирования. Пакет gopkg.in/yaml.v3 маппит поля YAML-файла на поля Go-структуры через теги. Секреты выносятся в конфигурационный файл, а сам файл добавляется в — так чувствительные данные не попадают в репозиторий.
type Config struct { Env string `yaml:"env"` } data, _ := os.ReadFile("config.yaml") var cfg Config yaml.Unmarshal(data, &cfg)
💡 Gotcha: Не забудьте добавить
config.yamlв.gitignoreдо первого коммита. Если файл с секретами попадёт в историю Git — удалить его оттуда будет непросто.
| Пакет | Назначение | Ключевые функции |
|---|---|---|
gopkg.in/yaml.v3 | Чтение/запись YAML | Unmarshal, Marshal |
os | Работа с файлами | ReadFile |
Создать систему конфигурации и точку входа приложения.
Что необходимо сделать:
Пакет src/internal/config:
Структура Config:
Env (string) — окружение (local, dev, prod), с yaml-тегом envФункция:
func Load(path string) (*Config, error)
Логика:
ConfigФайлы в корне проекта:
config.yaml с полем env: "local".gitignore с записью config.yamlПакет src/cmd/disksync:
main.go — точка входа:
Логика: вызвать config.Load, вывести значение Env, обработать ошибки.$ go run src/cmd/disksync/main.go Configuration loaded successfully, env: local
При отсутствии файла конфигурации:
$ go run src/cmd/disksync/main.go failed to load configuration: open config.yaml: no such file or directory
Config в пакете src/internal/config содержит поле Env string с yaml-тегом envLoad(path string) (*Config, error) создана в пакете src/internal/config и десериализует YAML через yaml.Unmarshalmain.go в src/cmd/disksync содержит package main и вызывает config.Load.gitignore существует и содержит запись config.yaml