这段代码为什么生成的是随机的0和1?
package main
import "fmt"
func main() {
ch := make(chan int , 1)
j := 0
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
if(j>10){
break;
}
j++;
fmt.Println("Value recevied:", i)
}
}
我的理解是循环中每次向 ch 中写入数据 ch 有可能是阻塞的,这种情况下 ch 的缓冲区是是1,
但是我把 ch 缓冲区长度改为 10 ch := make(chan int , 10)
好像也并没有用,还是随机的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection.
看这里,http://doc.golang.org/ref/spec#Select_statements
关键是每次只写了一个进去,马上就消费了
channel size 不是说填满后才从中取值,而是用来控制并发数的,只要有 receiver 准备好了,不管多大 size 的 channel 以及 channel 是否填满,数据都会立即被 receiver 取走。如果同时有大量(超过 channel size)的 goroutine 向同一个 channel 发数据,channel 只能接收 size 那么多的数据,多了的话 receiver 没有准备好,所以就会让 channel 发送端阻塞,size 越大表示可并发数越大,即可以同时响应更多客户端。如果有多个 receiver 准备好了,go 调度器会把数据随机交给一个 receiver 处理。
你这里 channel 的两端即 select 开的 goroutine 与主线程两者都是就绪状态,所以 select 每次就会随机挑选一个 case 执行