Основы синтаксиса Строки и руны Массивы и слайсы Map Структуры и методы Интерфейсы Горутины и конкурентность Каналы defer, panic, recover Обработка ошибок Указатели Пакет sync Тестирование Пакеты и модули Стандартная библиотека Context Generics iota и перечисления Разное / продвинутое

Каналы

8 вопросов

Каналы - основной механизм коммуникации между горутинами в Go. Буферизованные и небуферизованные, однонаправленные, select, закрытие каналов и типичные паттерны использования.

1 Какой тип возвращает make(chan int, 5)? 🟢 Лёгкий
Ответ: B) chan int

make(chan int, 5) создаёт буферизованный канал с ёмкостью 5. Тип - chan int (двунаправленный). Каналы - ссылочные типы, make возвращает сам канал, не указатель на него.

Подробнее →
2 Что произойдёт при чтении из закрытого канала? 🟡 Средний
Ответ: B) Вернётся zero value

Чтение из закрытого канала не блокирует - возвращается zero value типа элемента. Для проверки: v, ok := <-ch, где ok = false означает «канал закрыт». Цикл for v := range ch автоматически завершается при закрытии.

Подробнее →
3 Что произойдёт при отправке в небуферизованный канал без получателя? 🟡 Средний
Ответ: C) Горутина заблокируется

Небуферизованный канал (make(chan int)) синхронный: отправитель блокируется, пока получатель не прочитает. Если получателя нет - горутина навсегда заблокирована. Если это единственная горутина - deadlock.

Подробнее →
4 Что делает select в Go? 🟡 Средний
Ответ: B) Ожидает операции на каналах

select позволяет ждать на нескольких каналах одновременно. Выполняет первый готовый case. Если несколько готовы - выбирает случайно. С default - не блокирует.

Подробнее →
5 Что произойдёт при отправке в закрытый канал? 🟡 Средний
Ответ: C) panic

Отправка в закрытый канал вызывает panic: send on closed channel. Закрывать канал должен только отправитель, и только когда больше данных не будет. Получатели не должны закрывать каналы.

Подробнее →
6 Что такое однонаправленный канал chan<- int? 🟡 Средний
Ответ: B) Канал только для записи

chan<- int - канал, в который можно только отправлять. <-chan int - только получать. Используются в сигнатурах функций для ограничения доступа. Двунаправленный канал автоматически приводится к однонаправленному.

Подробнее →
7 Как дождаться закрытия канала через range? 🟡 Средний
Ответ: B) for v := range ch {}

for v := range ch читает из канала, пока он не закрыт. При закрытии цикл завершается. Самый чистый способ итерации по каналу. Не забудьте закрыть канал, иначе цикл заблокируется навсегда.

Подробнее →
8 Что произойдёт при повторном закрытии канала? 🟡 Средний
Ответ: C) panic

close(ch) при повторном вызове вызывает panic: close of closed channel. Канал можно закрыть только один раз. Проверки «закрыт ли канал» без чтения из него нет.

Подробнее →