Ответ
Блокировка при использовании буферизованного канала (make(chan T, N)
где N > 0
) происходит в двух предсказуемых ситуациях:
При отправке данных (
ch <- data
): Горутина блокируется, если буфер канала полностью заполнен. Она будет ждать, пока другая горутина не освободит место в буфере, прочитав из канала.При чтении данных (
<-ch
): Горутина блокируется, если буфер канала пуст. Она будет ждать, пока другая горутина не отправит данные в канал.
Это ключевое отличие от небуферизованного канала: отправка в буферизованный канал не блокируется, пока в буфере есть свободное место.
Пример блокировки при отправке:
// Канал с буфером на 2 элемента
ch := make(chan int, 2)
ch <- 1 // Не блокирует, в буфере есть место (1/2)
ch <- 2 // Не блокирует, в буфере есть место (2/2)
// Следующая операция заблокирует текущую горутину,
// так как буфер заполнен. Блокировка снимется,
// как только кто-то прочитает значение из канала.
ch <- 3