Как отправка, так и получение данных по небуферизованному каналу являются процессами блокировки.
В своем коде вы пытались отправить числовое значение 1
через канал ch
.Так как операция является блокирующей, код внизу не будет выполнен до выполнения текущей строки.
Во время выполнения оператора ch <- 1
, в то же время не запущен процесс извлечения данных из канала ch
.Поскольку тип канала не является буферизованным каналом, процесс отправки и получения должен происходить в одно и то же время.
В приведенном ниже примере я создал подпрограмму, содержащую код для отправки данных по каналу и другой код в основной подпрограмме для извлечения данных из канала.Это будет работать, так как основная процедура и процесс выполнения будут выполняться по отдельности и одновременно.
go func () {
ch <- 1
}()
gg := <-ch
Рабочая площадка: https://play.golang.org/p/ceIoVQLItNk
Существует также нечто, называемое , буферизованноеканал * * тысяча двадцать-одна.Используя это, вы сможете отправлять данные по каналу несколько раз, хотя пока еще не запущен процесс извлечения данных.Но есть правило, которому нужно следовать: вы можете отправить его только n
раз, в то время как n
представляет номер буфера.
Пример 1: отправить данные 2 раза (буфер установлен в 3), а затем получить их:
ch := make(chan int, 3)
ch <- 1
ch <- 1
gg := <-ch
Вывод: без паники
Пример 2: отправить данные 4 раза (буфер установлен в 3), затем извлечь их:
ch := make(chan int, 3)
ch <- 1
ch <- 1
ch <- 1
ch <- 1
gg := <-ch
Вывод: фатальная ошибка: все программы спят - тупик!
Дополнительная информация: https://blog.golang.org/pipelines