Golang для продвинутых
Вы научитесь проверять утверждения о Go-коде запуском и приносить на ревью правку, которую принимают по профилю и бенчмарку, а не на слово. Тесты зелёные, а сервис под нагрузкой тормозит, горутины копятся, счётчик иногда возвращает не то число. Ставить ничего не нужно: вы отправляете функцию, платформа собирает её в программу и прогоняет на тестах. В бенчмарке из курса замена конкатенации в цикле сводит 999 аллокаций на операцию к одной.
Чему вы научитесь
- Читать вывод go build -gcflags="-m": moved to heap, escapes to heap, leaking param. Менять форму кода так, чтобы значение осталось на стеке.
- Писать бенчмарки с b.N, ResetTimer и -benchmem и сравнивать реализации по allocs/op, B/op и ns/op.
- Снимать CPU- и heap-профили через go test, runtime/pprof и net/http/pprof, читать top по flat и cum, отличать alloc_space от inuse_space.
- Объяснять планировщик GMP: локальные очереди P, work stealing, что происходит с потоком при блокирующем вызове и откуда берётся thread exhaustion.
- Настраивать GOGC и GOMEMLIMIT с запасом под лимит контейнера и снижать число аллокаций: strings.Builder, предвыделение cap, sync.Pool.
- Запускать и останавливать горутины без утечек: каналы, select с таймаутом, context с отменой, fan-in и fan-out, проверка через runtime.NumGoroutine и goleak.
- Защищать общее состояние через Mutex, RWMutex, Once, atomic и errgroup и проверять код детектором гонок.
- Собирать HTTP-сервер с middleware и graceful shutdown, клиент с retry и backoff, ReverseProxy и TLS.
- Строить надёжный сервис: errors.Is, As и Join, сигналы и порядок остановки, circuit breaker и бюджет ретраев, expvar.
- Выбирать между интерфейсом и дженериком по выводу компилятора, понимать GC shape и словари, заменять рефлексию кодогенерацией.
Счётчик, который иногда врёт
Восемь горутин увеличивают общий счётчик, ошибок и паник нет. В трёх запусках из первых пяти ответ ровно 8000, и код кажется рабочим. Из 200 запусков верный ответ дали 49, а в остальных от 5 240 до 7 993.
Курс учит не доверять удачному запуску. Детектор гонок называет строку и две горутины, которые пишут и читают один адрес, и это видно даже тогда, когда ответ совпал. Дальше вы выбираете между Mutex, RWMutex, atomic и errgroup и проверяете правку тем же флагом.
Что нужно знать
Базовый Go: синтаксис, функции, структуры, слайсы, мапы и ошибки. Синтаксис в курсе считается известным.
Если базы пока нет, начните с курса по основам Go: https://mentorix.ru/catalog/5c0fffeb-db23-4f1d-b307-22f88020a6fd
Установленный Go не нужен: задачи собираются и проверяются на платформе.
Правка и замер до и после
Медленное место ищет профиль, а не догадка. В бенчмарке строка из 1000 символов собирается через s += "x": почти треть времени уходит на копирование строк, ещё четверть на runtime.mallocgc, рядом работает фоновый GC.
После strings.Builder с Grow(n) на операцию остаётся одна аллокация вместо 999, а время падает в 155 раз. В профиле после правки время уходит в сам цикл. В курсе вы читаете pprof -top по flat и cum, снимаете heap-профиль и решаете, искать утечку по inuse_space или резать аллокации по alloc_space.
Где вывод перестаёт работать
GOMAXPROCS ограничивает число процессоров P, а не потоков. Горутина в блокирующем вызове держит свой поток, и рантайм заводит новый. На картинке 20 таких горутин подняли число потоков с 5 до 23, а предел в 8 потоков процесс не пережил.
У вывода есть граница. Опыт снят на одном прогоне, а в уроке тот же опыт дал 22 потока. Ждала горутина в системном вызове, сетевой ввод-вывод опыт не проверял. Курс разбирает GMP, work stealing и sysmon так же: сначала механизм, потом условия, при которых он работает.
Что вы сдаёте и как это проверяют
Вы сдаёте функцию на Go. Платформа собирает её в программу, компилирует и прогоняет на тестах, как CI на работе. Засчитывается код, который работает. В условии лежит полный код этой программы, её можно скопировать и запустить у себя.
Многие задачи построены на выводе настоящих инструментов: разобрать лог -m по файлам, решить по правилам escape-анализа, куча или стек, найти функцию с наибольшим cum% в pprof -top, выбрать победителя бенчмарков по allocs/op. Там, где рантайм недетерминирован, задача — модель по правилам урока: work stealing между P, вытеснение горутины по порогу, срабатывание GC по GOGC. Поэтому проверка воспроизводима.
На картинке пример сверки прогнозов с компилятором. Прогноз «массив на 1 МБ уйдёт в кучу» не подтвердился: вывод -m надёжнее правила из памяти.
Для кого
Go-разработчикам, которые уверенно пишут на языке, но не могут по профилю объяснить, куда уходят процессор и память.
Backend-инженерам, у которых сервис держит много горутин: утечки, гонки, таймауты, корректная остановка.
Тем, кто ревьюит правки производительности и хочет принимать их по бенчмарку и профилю, а не на слово.
Поддержка
Вы также можете задать любой вопрос по курсу у поддержки t.me/mentorix_support
Программа курса
Модулей: 9, уроков: 54. Задачи с кодом проверяются автоматически.
Система типов и интерфейсы
- Структуры с вложением и переопределение методов
- Пустой интерфейс и type assertion
- Type switch для полиморфного поведения
- Композиция интерфейсов в крупных проектах
- Обобщённые типы с дженериками
- Ограничения типов через constraints
Конкурентность и горутины
- Паттерны запуска и остановки горутин
- Буферизованные и небуферизованные каналы
- Select с таймаутами и отменой
- Fan-in и fan-out через каналы
- Контексты для управления жизненным циклом
- Обнаружение утечек горутин
- Rate limiting с помощью тикеров
Синхронизация и безопасность данных
- Mutex и RWMutex для защиты состояния
- sync.Once и ленивая инициализация
- sync.Pool для переиспользования объектов
- Атомарные операции из пакета atomic
- WaitGroup и ErrGroup для параллельных задач
Сетевое программирование и HTTP
- Кастомный HTTP-сервер с middleware
- Graceful shutdown сервера
- HTTP-клиент с retry и backoff
- Работа с WebSocket-соединениями
- Потоковая передача данных через chunked response
- Мультиплексирование маршрутов без фреймворков
- TLS-конфигурация для клиента и сервера
- Проксирование запросов через ReverseProxy
Тестирование и профилирование
- Табличные тесты и субтесты
- Моки через интерфейсы без библиотек
- Бенчмарки и сравнение аллокаций
- Fuzz-тестирование для поиска крайних случаев
- CPU и memory профилирование через pprof
- Трассировка выполнения с помощью trace
Архитектура Go-приложений
- Организация пакетов в монорепозитории
- Внедрение зависимостей без контейнеров
- Конфигурация через переменные окружения и файлы
- Структурированное логирование с slog
- Кодогенерация с go generate
- Плагины и динамическая загрузка модулей
- Сборка и кросс-компиляция для разных платформ
Внутренности рантайма и оптимизация
- Планировщик GMP: как Go гоняет горутины
- Escape analysis: стек или куча
- GC: как работает и как тюнить
- Слайсы и мапы под капотом
- PGO и флаги сборки
Надёжный production-сервис
- Ошибки по-взрослому: wrap, Is, As, join
- Сигналы и жизненный цикл процесса
- Устойчивость: circuit breaker и retry-бюджет
- embed, expvar и самонаблюдение сервиса
- Практика: устойчивый воркер-пул с отчётом
Дженерики, рефлексия и кодогенерация
- Параметры типа и ограничения
- Дженерик-типы и структуры данных
- Когда дженерики вредны
- reflect: типы и значения во время выполнения
- Кодогенерация вместо рефлексии
Стоимость курса: 8990 ₽
Открыть курс на Mentorix · Все курсы