8 вопросов
Каналы - основной механизм коммуникации между горутинами в Go. Буферизованные и небуферизованные, однонаправленные, select, закрытие каналов и типичные паттерны использования.
make(chan int, 5)? 🟢 Лёгкий
▶
make(chan int, 5) создаёт буферизованный канал с ёмкостью 5. Тип - chan int (двунаправленный). Каналы - ссылочные типы, make возвращает сам канал, не указатель на него.
Подробнее →Чтение из закрытого канала не блокирует - возвращается zero value типа элемента. Для проверки: v, ok := <-ch, где ok = false означает «канал закрыт». Цикл for v := range ch автоматически завершается при закрытии.
Подробнее →Небуферизованный канал (make(chan int)) синхронный: отправитель блокируется, пока получатель не прочитает. Если получателя нет - горутина навсегда заблокирована. Если это единственная горутина - deadlock.
Подробнее →select в Go? 🟡 Средний
▶
select позволяет ждать на нескольких каналах одновременно. Выполняет первый готовый case. Если несколько готовы - выбирает случайно. С default - не блокирует.
Подробнее →Отправка в закрытый канал вызывает panic: send on closed channel. Закрывать канал должен только отправитель, и только когда больше данных не будет. Получатели не должны закрывать каналы.
Подробнее →chan<- int? 🟡 Средний
▶
chan<- int - канал, в который можно только отправлять. <-chan int - только получать. Используются в сигнатурах функций для ограничения доступа. Двунаправленный канал автоматически приводится к однонаправленному.
Подробнее →for v := range ch читает из канала, пока он не закрыт. При закрытии цикл завершается. Самый чистый способ итерации по каналу. Не забудьте закрыть канал, иначе цикл заблокируется навсегда.
Подробнее →close(ch) при повторном вызове вызывает panic: close of closed channel. Канал можно закрыть только один раз. Проверки «закрыт ли канал» без чтения из него нет.
Подробнее →