Небуферизованные каналы не имеют ёмкости и требуют, чтобы отправитель и получатель были готовы одновременно. Отправитель будет блокироваться до тех пор, пока горутина активно не получает данные.
Буферизованные каналы имеют определённую ёмкость и позволяют отправителям продолжать работу без немедленной блокировки. Данные хранятся в буфере до тех пор, пока получатель их не извлечёт.
// Небуферизованный канал - блокируется до получения
ch := make(chan int)
// Буферизованный канал с ёмкостью 5
ch := make(chan int, 5)
Даже с буферизованным каналом отправка в конечном счёте заблокируется, если буфер переполнится и ни один получатель не будет забирать данные. Поэтому размер буферизованных каналов нужно подбирать с учётом ожидаемых паттернов нагрузки, чтобы избежать deadlock'ов.
Небуферизованный канал заставит goroutine отправителя блокироваться сразу же до тех пор, пока другая goroutine не будет готова получить отправленное значение.
Новый — ещё не проверен сообществом
Вы