channel 和select的小问题

pssgo · · 1268 次点击
利用`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 ( &#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