Этап 5 из 7 · ≈ 8 ч

Горутины, каналы и context

Основа с Junior

Горутины, каналы и select, sync, context, утечки горутин и гонки.

Что важно знать

  • Горутина дешёвая; планировщик Go распределяет их по потокам.
  • Каналы передают данные и синхронизируют; закрывает отправитель.
  • select с ctx.Done() — отмена.
  • sync.Mutex, sync.WaitGroup, errgroup.
  • Утечка горутины — заблокирована навсегда на канале.

Критерии освоения

Junior ≈ 8 ч

  • Запускает горутины и синхронизирует их через WaitGroup и каналы

Практика. Параллельно скачать 20 страниц горутинами и собрать результаты через канал.

Middle ≈ 10 ч

  • Использует select, буферизованные каналы и пулы воркеров
  • Передаёт context для отмены и таймаутов
  • Находит гонки через -race и утечки горутин

Практика. Сделать пул воркеров с context, таймаутами и корректным завершением, проверить детектором гонок.

Senior ≈ 6 ч

  • Проектирует конкурентные конвейеры с ограничением параллельности и корректным завершением

Практика. Реализовать конвейер обработки событий с backpressure и graceful shutdown под нагрузкой.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Чем буферизованный канал отличается от небуферизованного и что происходит при закрытии канала?Junior

Небуферизованный канал — отправка блокируется, пока получатель не заберёт значение: синхронная встреча. Буферизованный (make(chan T, n)) — отправка блокируется только при полном буфере. close сообщает «значений больше не будет»: получение из закрытого канала…

Полный разбор
Что такое утечка горутин и как её избежать?Middle

Горутина, навсегда заблокированная на канале, мьютексе или вводе-выводе, никогда не завершится и держит стек и всё, на что ссылается. Типичные причины: отправка в канал, который никто не читает (вызывающий ушёл по таймауту), чтение из канала, который никто не…

Полный разбор
Зачем нужен context.Context?Junior

Context переносит отмену, дедлайн и значения запроса через цепочку вызовов и горутин. Создают от входящего запроса, передают первым аргументом во все функции с вводом-выводом. WithTimeout/WithCancel порождают дочерний контекст; отмена родителя отменяет всех…

Полный разбор
Что такое горутина и чем она отличается от потока ОС?Junior

Горутина — лёгкий поток, управляемый рантаймом Go: стартовый стек ~2 КБ (растёт по необходимости), создание и переключение в разы дешевле потока ОС — можно держать сотни тысяч. Планировщик M:N распределяет горутины (G) по потокам ОС (M) через логические…

Полный разбор
Что изменилось с переменной цикла в Go 1.22?Junior

До Go 1.22 переменная цикла for i := ... была одна на весь цикл: замыкания и горутины, захватившие её, видели последнее значение. С Go 1.22 каждая итерация получает свою копию — классическая ошибка исчезла (для модулей с go 1.22 в go.mod).

Полный разбор
Когда использовать каналы, а когда sync.Mutex и WaitGroup?Junior

Каналы — для передачи данных и владения ими между горутинами (конвейеры, очереди задач). Mutex — для защиты общего состояния (кэш, счётчик). WaitGroup — дождаться группы горутин. RWMutex — много читателей одновременно или один писатель.

Полный разбор
Как работает select в Go?Junior

select ждёт сразу несколько операций с каналами и выполняет ту, что готова первой; если готовы несколько — случайную. Ветка default делает select неблокирующим. Таймаут — ветка <-time.After(d) или <-ctx.Done().

Полный разбор

← Вся карта «Go»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования