Ответ
Операции чтения и записи в 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)
}