Ответ
Операции чтения и записи в nil-канал блокируют исполнение горутины навсегда.
Если в программе не останется других активных горутин, среда выполнения Go прервет программу с ошибкой fatal error: all goroutines are asleep - deadlock!.
Поведение при операциях:
Запись в
nil-каналvar ch chan int // ch == nil
ch <- 42 // Эта горутина заблокируется здесь навсегдаЧтение из
nil-каналаvar ch chan int // ch == nil
<-ch // Эта горутина также заблокируется навсегда
Практическое применение
Это предсказуемое поведение часто используется в операторе select для динамического включения или отключения одного из case. Если канал в case равен nil, этот case никогда не будет выбран.
var ch1, ch2 chan int
// ...
// Чтобы временно отключить обработку из ch2, можно сделать так:
// ch2 = nil
select {
case val := <-ch1:
fmt.Println("Получено из ch1:", val)
case val := <-ch2: // Этот case будет игнорироваться, если ch2 == nil
fmt.Println("Получено из ch2:", val)
}