通过非缓冲通道发送和检索数据都是阻塞进程。
在您的代码中,您尝试通过通道 ch 发送数值 1。由于操作是阻塞的,所以在当前行执行完成之前,下面的代码不会被执行。
在执行语句ch <- 1 期间,同时没有运行从通道ch 检索数据的进程。因为通道类型是非缓冲通道,所以发送和检索过程需要同时发生。
在下面的示例中,我创建了一个 goroutine,其中包含一个通过通道发送数据的代码,以及在主例程中从通道检索数据的另一个代码。这将起作用,因为 main 例程和 goroutine 进程将分别并发执行。
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
输出:致命错误:所有 goroutine 都处于休眠状态 - 死锁!
更多信息:https://blog.golang.org/pipelines