示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
c := make(chan int , 1)
        go func() { // 消费者
           <-c
        }()
go func() {  // 如果没有这个协程,就得报deadlock而终止程序
i := 0
for {
i++
}
}()
c <- 1
c <- 1
        c <- 1
}

如上程序:

如果没有第二个go协程,那么第一个协程是消费者,main协程是生产者,消费者死去后,就会出现deadlock错误; 原以为是runtime检测到我们在写一个没人消费的chan感到奇怪而报错,实际上不是的,甚至也不是写不进去而报错,而是,没有一个协程是能被执行的了(就好比陈佩斯的小偷中说的那样,这大半夜的也每个车让我指挥指挥),所以,runtime才感觉很迷茫,就报了个deadlock; 如果有第二个协程在的话,runtime会很高兴地去执行第二个协程的,真的不在意那个chan是否有人消费的。