package main
import "fmt"
func main() {
ch := make(chan int)
for i := 0; i < 10; i++ {
select {
case x:=<-ch:
fmt.Println(x)
case ch <- i:
fmt.Println(i)
}
}
}
- 请问这段代码,为什么运行不了呢?无缓冲的channel遇到select会发生什么?
有疑问加站长微信联系(非本文作者)

for循环只跑一下就被阻塞了,还能发生什么,case ch<-i
没有向通道写入数据
无缓冲select是同步(也就是不论是写入还是停止都会在同步下完成,不会先完成写入再完成读取),简单来说你这个就是死锁了
同一个channel出现在一个select的多个分支似乎没有实际用处
@mortemnh 说的是对的,ch 是无缓冲
channel
,执行到ch <- i
之后,如果没有接收方取值就会一直阻塞在这里,无法进入下次for
循环。你的代码和正常编译执行之间只差了一个
default:
select
本身就是找到第一个不阻塞的chan,如果都阻塞,就会执行default
。@birdkiller
default
可以编译通过但是程序上看其实没有意义,循环会一直走default
分支。为channel
加一个缓存,就解决了。你会发现结果是 0, 2, 4 ... 因为 for 循环 i = 1 时执行的是 received,所以每次发送 i 都是间隔一次循环。
@Donng 你这一说我才看出来,原来这代码是有意义的。