Ответ
В Go зависание при заполнении буфера возникает, когда канал заполнен и нет получателя. Например, небуферизованный канал блокирует отправителя до появления получателя, а буферизованный — только когда буфер заполнен.
Пример с буферизованным каналом:
ch := make(chan int, 1)
ch <- 1 // ок
ch <- 2 // зависание - буфер заполнен и нет получателя
Решение — либо увеличить буфер, либо использовать select с default для неблокирующей отправки:
select {
case ch <- value:
default:
// обработка переполнения
}
Также можно запустить получателя в отдельной горутине. Важно проектировать систему так, чтобы не допускать бесконечных блокировок.