ch := make(chan int, 1)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i) // 随机输出0和1
}
ch := make(chan int)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i) // 报错:fatal error: all goroutines are asleep - deadlock!
}
有没有大神可以解释下为什么啊?
不带缓冲的channel写完就阻塞,这种情况只有其他协程中有对应的读才能解除阻塞。而带缓冲的channel要直到写满+1才阻塞。所以根据你写的代码,make(chan int, 1),刚好一写一读,假如你多写一次其实也会阻塞。而make(chan int)写了就阻塞了,根本没机会读。可以对比下面的代码