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

这段代码为什么生成的是随机的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) 好像也并没有用,还是随机的


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 执行

【热门文章】
【热门文章】