channel 和select的小问题

pssgo · · 1152 次点击
你这么改一下: ``` select { case v1, ok1 = <- ch1: s = "a" v = v1 ok = ok1 case v1, ok1 = <- ch2: s = "b" v = v1 ok = ok1 } ```
#6
更多评论
```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