Что произойдет при попытке записи или чтения из `nil`-канала?

Ответ

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