## 新人刚在学习golang,遇到channel的这个问题,goroutine中的select中的case 的ok 会变成false 那? 发送到channel的数据都是ok的啊,如果我把ch1 的容量去掉的话 就正常了
### 这是什么问题那?
![image.png](https://static.studygolang.com/180829/fbf2072437e332b62b7a0a9f8fc0e278.png)
<a href="/user/fuhuizn" title="@fuhuizn">@fuhuizn</a> <a href="/user/justay" title="@justay">@justay</a> <a href="/user/lee_" title="@lee_">@lee_</a> 谢谢各位我懂啦,因为随机发送到的chan不一样第一次正常,第二次可能某个通道已经关闭了 ok是false 所以才会退出, 谢谢各位
#8
更多评论
```golang
v,ok=<-chan
```
这里的`ok`是说`c`是否关闭,因为关闭之后从chan种读取数据会立即返回。
```golang
c:=make(chan int,2)
v,ok:=<-c // 阻塞,等待从c中读取数据
// 关闭chan
close(c)
v,ok:=<-c //不会阻塞,立即返回,如果此次从chan中读取到了值,则ok为true,否则为false且v为零值
```
#1
<a href="/user/justay" title="@justay">@justay</a> 问题是我的channel 没有全部接收完毕啊, chan怎么会被关闭那?
这是完整代码
```golang
package main
import (
"fmt"
"os"
)
func main() {
ch1,ch2 := make(chan int, 3), make(chan int)
go func() {
v, ok, s := 0, false, ""
for {
select {
case v, ok = <- ch1:
s = "a"
case v, ok = <- ch2:
s = "b"
}
if ok {
fmt.Println("v&s",v, s)
}else {
os.Exit(1)
}
}
}()
for i:= 1; i < 4; i++ {
select {
case ch1 <- i:
case ch2 <- i:
}
}
fmt.Println("send over")
close(ch1)
close(ch2)
fmt.Println("ch",ch1,ch2)
select {} // 阻塞进程
}
```
#2