程序运行死锁,报错: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!