Содержание курса
Модуль 1. Введение: от джуна к продуктивному мидлу
6 уроков
1.
О курсе: как проходить обучение и канал «Логово Дата-Инженера»
↗
2.
Чем мидл на Go отличается от джуна: не только «больше кода»
↗
3.
Краткая ревизия базы: типы, функции, срезы и карты на одном…
↗
4.
Ещё одна ревизия: интерфейсы, методы и обработка ошибок в…
↗
5.
Как устроен этот курс и как с ним работать
↗
6.
Обновляем инструменты: go vet, staticcheck, golangci-lint
↗
Модуль 2. Композиция и встраивание
7 уроков
1.
Композиция против наследования: почему в Go нет классов, и…
↗
2.
Встраивание структур: поле без имени продвигает свои методы и…
↗
3.
Продвижение методов: встроенный тип делится поведением
↗
4.
Переопределение методов при встраивании: «теневое» замещение
↗
5.
Встраивание интерфейсов: собираем большой контракт из маленьких
↗
6.
Множественное встраивание: несколько типов в одной структуре
↗
7.
Когда встраивание уместно, а когда лучше явное поле
↗
Модуль 3. Интерфейсы глубоко
9 уроков
1.
Интерфейс как значение: два слова под капотом — тип и…
↗
2.
nil-интерфейс против nil-указателя в интерфейсе: классическая…
↗
3.
Принимай интерфейсы, возвращай конкретные типы: главный…
↗
4.
Маленькие интерфейсы: один-три метода вместо мегаконтракта
↗
5.
Паттерн Reader: один метод Read — и весь мир открыт
↗
6.
Интерфейсы для тестирования: подменяем реальные зависимости…
↗
7.
Множественное удовлетворение: один тип может реализовать…
↗
8.
Интерфейсы из стандартной библиотеки: io.Closer…
↗
9.
Свои интерфейсы: как проектировать контракт под задачу, а не…
↗
Модуль 4. Обработка ошибок по-взрослому
7 уроков
1.
Вспоминаем error, errors.New и fmt.Errorf
↗
2.
Сентинел-ошибки: var ErrNotFound = errors.New(...) и errors.Is
↗
3.
Кастомный тип ошибки с контекстом: что пошло не так и где
↗
4.
Оборачивание цепочек: fmt.Errorf с %w и errors.Unwrap
↗
5.
errors.Is и errors.As в глубину: как ходить по цепочке ошибок
↗
6.
errors.Join: объединяем несколько ошибок в одну
↗
7.
Стратегия обработки: где логировать, где оборачивать, а где…
↗
Модуль 5. Горутины
8 уроков
1.
Горутина: ключевое слово go и функция, летящая в фоне
↗
2.
Чем горутина отличается от потока ОС: стек в 2 КБ и…
↗
3.
Планировщик Go: G-M-P модель простыми словами
↗
4.
Горутины — не потоки: тысячи горутин не равны тысяче потоков
↗
5.
Дочерние горутины и время жизни: кто кого переживёт
↗
6.
Утечка горутин: как забытая горутина съедает память
↗
7.
runtime.NumGoroutine: смотрим, сколько горутин работает
↗
8.
Практика: запускаем горутины и убеждаемся, что main их не ждёт
↗
Модуль 6. Каналы
8 уроков
1.
Канал: типизированная труба между горутинами через make(chan T)
↗
2.
Отправка и получение: оператор <- и блокирующая природа каналов
↗
3.
Небуферизованные каналы: синхронная передача — отправитель…
↗
4.
Буферизованные каналы: асинхронная ёмкость фиксированного…
↗
5.
Закрытие канала: close и что меняется для получателя
↗
6.
for range по каналу и comma ok: читаем, пока открыт, и…
↗
7.
Однонаправленные каналы: chan<- и <-chan в сигнатурах функций
↗
8.
select: ждём несколько каналов одновременно, как switch для…
↗
Модуль 7. Паттерны конкурентности
9 уроков
1.
Pipeline: цепочка горутин, соединённых каналами — этап за этапом
↗
2.
Fan-out: один входной канал, много рабочих горутин
↗
3.
Fan-in: сливаем несколько каналов в один
↗
4.
Паттерн generator: функция возвращает канал с данными
↗
5.
Timeout через time.After и select
↗
6.
Done-канал: вежливая отмена горутины
↗
7.
Пул воркеров: фиксированное число горутин обрабатывает…
↗
8.
Ошибки в горутинах: как передать ошибку через канал ошибок
↗
9.
Практика: собираем конкурентный пайплайн обработки данных
↗
Модуль 8. Синхронизация
8 уроков
1.
sync.Mutex: взаимное исключение для защиты общих данных
↗
2.
sync.RWMutex: много читателей или один писатель
↗
3.
sync.WaitGroup: ждём группу горутин
↗
4.
sync.Once: выполняем код ровно один раз, даже при…
↗
5.
sync.Pool: временное хранилище для переиспользования объектов
↗
6.
sync/atomic: атомарные операции без мьютекса
↗
7.
sync.Map: конкурентная карта для особых случаев
↗
8.
Cond, ErrGroup и другие: обзор продвинутых примитивов
↗
Модуль 9. Дженерики глубоко
7 уроков
1.
Вспоминаем синтаксис: тип-параметры, квадратные скобки и…
↗
2.
Пакет constraints и встроенные ограничения: any, comparable…
↗
3.
Ограничение типа через интерфейс: T может быть любым типом с…
↗
4.
Тильда ~ в ограничениях: разрешаем именованные типы с той же…
↗
5.
Дженерики в структурах: обобщённый кэш, стек, дерево
↗
6.
Дженерики и производительность: мономорфизация или…
↗
7.
Когда дженерики избыточны: интерфейсы часто решают задачу проще
↗
Модуль 10. Тестирование глубоко
8 уроков
1.
Table-driven tests: лучшая практика и организация тестовых…
↗
2.
Подтесты t.Run с параллельным выполнением: t.Parallel
↗
3.
TestMain: общая подготовка и очистка для всего тестового пакета
↗
4.
Временные файлы и директории: t.TempDir для изолированных тестов
↗
5.
Золотые файлы (golden files): сравниваем вывод с эталоном
↗
6.
Заглушки и моки через интерфейсы: подменяем зависимости для…
↗
7.
Интеграционные тесты с build-тегами и отдельной папкой
↗
8.
Бенчмарки: Benchmark-функции и go test -bench
↗
Модуль 11. Контекст и отмена
6 уроков
1.
Контекст как стандартный способ отмены операций
↗
2.
context.Background и context.TODO: корневые контексты
↗
3.
context.WithCancel: создаём отменяемый контекст
↗
4.
context.WithTimeout и WithDeadline: автоматическая отмена по…
↗
5.
context.WithValue: передаём значения через контекст и когда…
↗
6.
Контекст в горутинах: передаём отмену по цепочке
↗
Модуль 12. Базы данных
7 уроков
1.
database/sql: общий интерфейс для SQL-баз в Go
↗
2.
Подключаем драйвер PostgreSQL через pgx
↗
3.
Открываем соединение: sql.Open, пул соединений и Ping
↗
4.
Exec и Query: выполняем запросы и читаем результаты
↗
5.
sql.Rows и sql.Row: перебор строк и сканирование в структуру
↗
6.
Транзакции: Begin, Commit и Rollback
↗
7.
Миграции через goose или golang-migrate: управляем схемой базы
↗
Модуль 13. HTTP-сервер
9 уроков
1.
net/http: стандартная библиотека, которой достаточно
↗
2.
Обработчик (handler): функция с сигнатурой http.HandlerFunc
↗
3.
Мультиплексор: http.ServeMux и регистрация маршрутов
↗
4.
Методы HTTP: различаем GET, POST, PUT, DELETE в одном…
↗
5.
Чтение query-параметров, заголовков и тела запроса
↗
6.
Формирование ответа: статус-коды, заголовки и тело
↗
7.
Middleware: оборачиваем обработчики для логирования…
↗
8.
Graceful shutdown: вежливо останавливаем сервер через контекст
↗
9.
Структура проекта: handlers, services, repositories —…
↗
Модуль 14. JSON, XML и сериализация
6 уроков
1.
encoding/json: marshal и unmarshal в деталях
↗
2.
Структурные теги json: переименование, omitempty, игнорирование
↗
3.
Кастомный marshaling: реализуем json.Marshaler и…
↗
4.
Работа с динамическим JSON: json.RawMessage и…
↗
5.
Потоковый JSON: json.Encoder и json.Decoder для больших объёмов
↗
6.
encoding/xml: обзор работы с XML-документами
↗
Модуль 15. Логирование и конфигурация
5 уроков
1.
log/slog: структурированное логирование в стандартной…
↗
2.
Атрибуты и уровни логирования: Info, Warn, Error, Debug
↗
3.
Обработчики slog: текстовый и JSON-вывод
↗
4.
Конфигурация через переменные окружения: os.Getenv и…
↗
5.
Конфигурационные файлы: YAML через gopkg.in/yaml.v3
↗
Модуль 16. Рефлексия
5 уроков
1.
reflect.Type и reflect.Value: два главных типа пакета reflect
↗
2.
Получаем reflect.Type от переменной и от литерала
↗
3.
Обход полей структуры через рефлексию
↗
4.
Вызов метода по имени через reflect
↗
5.
reflect.DeepEqual: глубокое сравнение любых значений
↗
Модуль 17. Модули и зависимости продвинуто
5 уроков
1.
go.mod глубже: require, replace, exclude и indirect-зависимости
↗
2.
Семантическое версионирование на практике: мажор, минор, патч
↗
3.
Работа с несколькими модулями в одном репозитории
↗
4.
Приватные модули: GOPRIVATE и доступ к внутренним репозиториям
↗
5.
Вендоринг: go mod vendor для фиксации зависимостей в проекте
↗
Модуль 18. Продвинутые инструменты
5 уроков
1.
golangci-lint: сотни линтеров в одном запуске
↗
2.
go vet: встроенный статический анализ от команды Go
↗
3.
staticcheck: продвинутый анализ кода за пределами go vet
↗
4.
pprof и go tool trace: профилируем CPU, память и горутины
↗
5.
go generate: автоматическая кодогенерация в проекте
↗
Модуль 19. Паттерны в Go
7 уроков
1.
Functional options: конфигурируем объекты элегантно
↗
2.
Паттерн Repository: абстрагируем доступ к данным за интерфейсом
↗
3.
Паттерн Worker pool: переиспользуем горутины через канал задач
↗
4.
Circuit Breaker: защищаемся от каскадных отказов
↗
5.
Retry с exponential backoff: повторяем операции с умом
↗
6.
Rate limiting через time.Ticker: ограничиваем частоту операций
↗
7.
Graceful degradation: сервис продолжает работать частично, а…
↗
Модуль 20. Итоговый проект: HTTP-сервис менеджера задач
7 уроков
1.
Проект: архитектура сервиса — handlers, services, repository
↗
2.
Модель данных и интерфейсы: проектируем контракты
↗
3.
Реализуем хранение: PostgreSQL через pgx и паттерн Repository
↗
4.
HTTP API: CRUD-обработчики с JSON и кодами ответа
↗
5.
Middleware: логирование, паника-recovery и контекст
↗
6.
Тесты: юнит-тесты с моками, интеграционные с тестовой базой
↗
7.
Куда двигаться дальше: анонс курса «Go для сеньоров»
↗