程序运行死锁,报错:all goroutines are asleep - deadlock!
通道的类型
无缓冲区通道:发送端发送数据时,必须有接收端接收数据,需要立刻接收数据,如没有立刻接收数据则会阻塞;
有缓冲区通道:发送端发送数据和接收端接收数据可以异步,不需要立刻接收数据,但缓冲区满载后无法继续填入数据。
各种通道的实现
无缓冲区:var primechan chan int
有缓冲区:primechan := make(chan int,5)
报错代码
func main() { var primechan chan int primechan <- 123 for i := 0; i < 1; i++ { <-primechan break } close(primechan) }
因为无缓冲区通道发送端发送数据之后没有被立刻接收数据,因此线程阻塞,无法向下运行,因此造成死锁(非常可怕),那么,知道问题原因之后,解决问题就非常容易了,只需要将channel的相关操作放入新的协程中操作就可以了。
func main() { var primechan chan int go func(primechan chan int){ <-primechan close(primechan) }(primechan) go func(primechan chan int){ primechan <- 123 }(primechan) }
要谨慎的在main函数中操作cannel!