Ответ
Небуферизированные каналы в Go работают по принципу синхронного обмена данными. Отправка (ch <- data) блокирует горутину до тех пор, пока другая горутина не выполнит чтение (<-ch), и наоборот.
Пример:
ch := make(chan int) // небуферизированный канал
go func() {
ch <- 42 // блокируется, пока main() не прочитает
}()
val := <-ch // получает 42
Ключевые особенности:
- Обязательное соответствие операций отправки/приема
- Deadlock при отсутствии получателя/отправителя
- Гарантирует, что данные будут переданы напрямую между горутинами