## 新人刚在学习golang,遇到channel的这个问题,goroutine中的select中的case 的ok 会变成false 那? 发送到channel的数据都是ok的啊,如果我把ch1 的容量去掉的话 就正常了
### 这是什么问题那?
![image.png](https://static.studygolang.com/180829/fbf2072437e332b62b7a0a9f8fc0e278.png)
i存入的channel可能是ch1 **或** ch2
存入的值可能是:
ch1 : 1
ch2 : 2、3、4
在goroutine里select对准备就绪channel进行随机读取
所以存在这样的读取可能 第1、2次都是读到的ch1,所以就打印出1,第二次读到ch1,因为已经关闭,直接退出
#3
更多评论
```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