Пустой канал в Go
Объявление канала без создания дает нулевое значение типа. Такой канал не связан ни с какой очередью: и отправка, и прием в него блокируют ветку навсегда.
Это не то же самое, что закрытый канал: закрытый принимает прием с признаком конца, а нулевой просто ждет пару, которой не будет, пока не присвоят результат создания.
Сравним нулевой и рабочий канал в одной программе:
package main
import "fmt"
func main() {
var empty chan int
ok := make(chan int, 1)
ok <- 1
fmt.Println(<-ok)
_ = empty
}
Прием из ok печатает 1.
Строка с empty в комментарии
напоминает: операция с ним остановила
бы программу.
Иногда намеренно обнуляют переменную канала в ветке конструкции выбора, чтобы отключить одну из операций:
package main
import "fmt"
func main() {
ch := make(chan int)
var off chan int
_ = ch
_ = off
fmt.Println("ready")
}
Дан следующий код:
var ch chan int
ch <- 1
Скажите, что произойдет на второй строке.
Дан следующий код:
var ch chan int
v := <-ch
Скажите, дойдет ли присваивание в
v до конца.
Скажите, чем нулевой канал отличается от закрытого пустого канала при приеме.