## 新人刚在学习golang,遇到channel的这个问题,goroutine中的select中的case 的ok 会变成false 那? 发送到channel的数据都是ok的啊,如果我把ch1 的容量去掉的话 就正常了
### 这是什么问题那?
![image.png](https://static.studygolang.com/180829/fbf2072437e332b62b7a0a9f8fc0e278.png)
利用`select`对`chan`进行操作是随机选取`chan`的。无论是往里面写数据或是读数据。
```golang
for i:= 1; i < 4; i++ {
select {
case ch1 <- i:
case ch2 <- i:
}
}
```
这段会导致ch1,ch2里面的内容[1,2,3]是随机分布的。
```golang
select {
case v, ok = <- ch1:
s = "a"
case v, ok = <- ch2:
s = "b"
}
```
这段读的顺序也是随机的,随机从`ch1`,`ch2`里读取数据。想判断的话不要用同一个变量, 分别用不同的`ok`变量则可以避免你的问题.
#5
更多评论
```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