Вопрос проверяет понимание работы небуферизированных каналов и поведения горутин при конкурентной записи.
При записи в небуферизированный канал горутина блокируется, пока другая горутина не прочитает данные. Если несколько горутин пишут одновременно — возникает deadlock, если нет читателей. Паники не происходит.
Небуферизированный канал (make(chan T)) синхронизирует горутины:
Запись:
Блокируется, пока канал не будет прочитан.
Если несколько горутин пишут — они ждут очередно (первая запись разблокируется при чтении).
Чтение:
Блокируется, пока не появятся данные.
Пример deadlock:
package main
func main() {
ch := make(chan int) // Небуферизированный канал
go func() { ch <- 1 }()
go func() { ch <- 2 }() // Deadlock, если нет читателей
// Нужен хотя бы один <-ch
}Как избежать:
Добавить буфер (make(chan int, 2)).
Запустить читателя до записи.
Вывод:
Небуферизированные каналы полезны для синхронизации, но требуют аккуратного использования.