channel 和select的小问题

pssgo · · 1268 次点击
<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=&lt;-chan ``` 这里的`ok`是说`c`是否关闭,因为关闭之后从chan种读取数据会立即返回。 ```golang c:=make(chan int,2) v,ok:=&lt;-c // 阻塞,等待从c中读取数据 // 关闭chan close(c) v,ok:=&lt;-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