``` golang?linenums
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会发生什么?
<a href="/user/birdkiller" title="@birdkiller">@birdkiller</a> `default` 可以编译通过但是程序上看其实没有意义,循环会一直走 `default` 分支。为 `channel` 加一个缓存,就解决了。
你会发现结果是 0, 2, 4 ... 因为 for 循环 i = 1 时执行的是 received,所以每次发送 i 都是间隔一次循环。
```
package main
import "fmt"
func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println("received", x)
case ch <- i:
fmt.Println("send", i)
default:
fmt.Println("阻塞了", i)
}
}
}
```
#8
更多评论