channel 和select的小问题

pssgo · · 1242 次点击
```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