Воркшоп: Weather CLI на cobra
Это первый урок Go-трека и одновременно практический воркшоп. Цель не выучить синтаксис (он у тебя уже есть после Tour of Go и code-basics), а собрать первую маленькую утилиту по идиоматичному пути и сразу заложить привычки, которые понадобятся весь дальнейший курс: репозиторий с документами, диаграммы рядом с кодом, осознанная работа с ошибками, чистая граница между транспортом и доменной логикой.
Стартовая точка
Перед уроком ты прошёл два бесплатных курса:
- A Tour of Go, базовый синтаксис, типы, функции, структуры, методы, интерфейсы, горутины и каналы на уровне знакомства.
- code-basics: Go, упражнения, которые закрепляют тот же материал.
Этого хватает, чтобы читать чужой Go-код и писать простые программы. Дальше надо учиться писать его идиоматично, и здесь начинается отдельная работа.
Конспект-лекция
Параллельно с воркшопом читай урок Идиоматика Go и stdlib, там разобраны:
- структура Go-проекта (
internal/,cmd/, почемуpkg/скорее не нужен), - ключевые идиомы из Effective Go и Code Review Comments,
- Go Proverbs Роба Пайка с разбором,
- глубже по stdlib:
errors,io,bufio,encoding/json,time,flag,log/slog, - обзор книги Donovan/Kernighan и того, что читать дальше.
Конспект длинный, не пытайся проглотить за один присест. Базовые разделы прочитай до старта воркшопа, остальное возвращайся читать по мере того, как доходишь до соответствующих кусков ДЗ.
Что собираем
Маленькая CLI-утилита, которая показывает текущую погоду для города:
$ weather get --city Tbilisi
Tbilisi: +14°C, ясно. Восход 07:42, закат 18:05.
$ weather get --city Berlin --units imperial --log-format json
Berlin: 57°F, partly cloudy. Sunrise 07:01, sunset 17:38.
Базовый каркас собирается за час по официальному tutorial cobra. Дальше наращиваем мясом: реальный API-провайдер, нормальные ошибки, тесты, документы.
План работы
- Заведи репозиторий
weather-cli(или назови как угодно),go mod init, первый коммит с пустымmain.goиREADME.md. - Пройди cobra getting-started в этом репозитории. На выходе у тебя пустые
команды
weather,weather get, флаги. - Подключи реального провайдера погоды. Бери Open-Meteo, у него нет ключа и есть всё нужное (geo-coding по названию города плюс текущая погода). Это позволит не возиться с регистрацией.
- Раскидай по пакетам так, как разобрано в конспекте:
internal/weather, доменные типы (Weather,Forecast,Units),internal/provider, HTTP-клиент к Open-Meteo,cmd/weather/main.go, точка входа и сборка зависимостей.
- Сделай ошибки идиоматично. Sentinel
var ErrCityNotFound = errors.New(...),var ErrProviderUnavailable = errors.New(...), оборачивай через%w, обрабатывай в command handler-ах с понятными сообщениями. - Структурированный лог через
log/slog: JSON в проде, текст в dev, управление через флаг--log-format. - Положи документы рядом с кодом.
docs/diagrams/,docs/scenarios.feature,docs/adr/0001-grpc.md. Это та же привычка, что в нашем основном проекте.
премиум-урок
Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.