1. 首页
  2. 主题
  3. Go问与答

channel 和select的小问题

pssgo · · 1678 次点击
## 新人刚在学习golang,遇到channel的这个问题,goroutine中的select中的case 的ok 会变成false 那? 发送到channel的数据都是ok的啊,如果我把ch1 的容量去掉的话 就正常了 ### 这是什么问题那? ![image.png](https://static.studygolang.com/180829/fbf2072437e332b62b7a0a9f8fc0e278.png)
```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 ( &#34;fmt&#34; &#34;os&#34; ) func main() { ch1,ch2 := make(chan int, 3), make(chan int) go func() { v, ok, s := 0, false, &#34;&#34; for { select { case v, ok = &lt;- ch1: s = &#34;a&#34; case v, ok = &lt;- ch2: s = &#34;b&#34; } if ok { fmt.Println(&#34;v&amp;s&#34;,v, s) }else { os.Exit(1) } } }() for i:= 1; i &lt; 4; i++ { select { case ch1 &lt;- i: case ch2 &lt;- i: } } fmt.Println(&#34;send over&#34;) close(ch1) close(ch2) fmt.Println(&#34;ch&#34;,ch1,ch2) select {} // 阻塞进程 } ```
#2
i存入的channel可能是ch1 **或** ch2 存入的值可能是: ch1 : 1 ch2 : 2、3、4 在goroutine里select对准备就绪channel进行随机读取 所以存在这样的读取可能 第1、2次都是读到的ch1,所以就打印出1,第二次读到ch1,因为已经关闭,直接退出
#3

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中