这段代码为什么生成的是随机的0和1?

发布于 2022-09-01 18:46:57 字数 481 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浊酒尽余欢 2022-09-08 18:46:57

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

寂寞美少年 2022-09-08 18:46:57

关键是每次只写了一个进去,马上就消费了

上课铃就是安魂曲 2022-09-08 18:46:57

channel size 不是说填满后才从中取值,而是用来控制并发数的,只要有 receiver 准备好了,不管多大 size 的 channel 以及 channel 是否填满,数据都会立即被 receiver 取走。如果同时有大量(超过 channel size)的 goroutine 向同一个 channel 发数据,channel 只能接收 size 那么多的数据,多了的话 receiver 没有准备好,所以就会让 channel 发送端阻塞,size 越大表示可并发数越大,即可以同时响应更多客户端。如果有多个 receiver 准备好了,go 调度器会把数据随机交给一个 receiver 处理。

你这里 channel 的两端即 select 开的 goroutine 与主线程两者都是就绪状态,所以 select 每次就会随机挑选一个 case 执行

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文