Чем буферизованный канал отличается от небуферизованного и что происходит при закрытии канала?
- Как работают каналы в Go?
- Кто должен закрывать канал?
Небуферизованный канал — отправка блокируется, пока получатель не заберёт значение: синхронная встреча. Буферизованный (make(chan T, n)) — отправка блокируется только при полном буфере. close сообщает «значений больше не будет»: получение из закрытого канала сразу возвращает нулевое значение и ok == false, отправка в закрытый — panic.
- Закрывает отправитель, а не получатель
- for v := range ch — читает до закрытия
- Операции с nil-каналом блокируются навсегда
А ещё «Не общайтесь через общую память — делитесь памятью через общение»
Подробно
Семантика:
| операция | открытый | закрытый | nil |
|---|---|---|---|
| отправка | ждёт получателя или места | panic | блок навсегда |
| получение | ждёт значения | нулевое, ok=false | блок навсегда |
| close | закрывает | panic | panic |
Небуферизованный канал синхронизирует две горутины: после передачи обе знают, что значение доставлено. Буфер сглаживает всплески и развязывает производителя и потребителя, но не должен маскировать медленного потребителя.
Кто закрывает: единственный отправитель, когда данных больше нет. При нескольких отправителях — отдельная координация (WaitGroup и закрытие после завершения всех).
Направленные типы: chan<- T — только отправка, <-chan T — только получение; ограничивают использование в сигнатурах.
Пример
jobs := make(chan int, 100)
results := make(chan int)
for w := 0; w < 4; w++ {
go func() {
for j := range jobs { // до close(jobs)
results <- j * j
}
}()
}
for i := 0; i < 10; i++ { jobs <- i }
close(jobs)Что хотят услышать
- Блокировки буферизованного и небуферизованного.
- Поведение закрытого канала.
- Кто закрывает.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Небуферизованный — встреча сторон; из закрытого читается ноль с ok == false
- ✗Буферизованный канал блокирует отправку всегда
- ✗Канал должен закрывать получатель
- ✗Отправка в закрытый канал просто возвращает false и не вызывает panic
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.