Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Семантика:

операцияоткрытыйзакрытый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)

Что хотят услышать

  • Блокировки буферизованного и небуферизованного.
  • Поведение закрытого канала.
  • Кто закрывает.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем