Вопрос с собеседования · Go

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

JuniorГорутины и каналы
Ещё спрашивают так:
  • Как работают каналы в Go?
  • Кто должен закрывать канал?
Коротко

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

  • Закрывает отправитель, а не получатель
  • for v := range ch — читает до закрытия
  • Операции с nil-каналом блокируются навсегда

А ещё «Не общайтесь через общую память — делитесь памятью через общение»

Подробно

Семантика:

операцияоткрытыйзакрытыйnil
отправкаждёт получателя или местаpanicблок навсегда
получениеждёт значениянулевое, ok=falseблок навсегда
closeзакрываетpanicpanic

Небуферизованный канал синхронизирует две горутины: после передачи обе знают, что значение доставлено. Буфер сглаживает всплески и развязывает производителя и потребителя, но не должен маскировать медленного потребителя.

Кто закрывает: единственный отправитель, когда данных больше нет. При нескольких отправителях — отдельная координация (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 минут бесплатно.

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