根据选择的使用情况,向无缓冲通道写入两次会导致不同的结果。为什么?

考虑两个例子:


第一:


package main


import "fmt"


func main() {

        c := make(chan int)

        go func(){

                c <- 1

        }()

        go func(){

                c <- 2

        }()

        select {

        case <-c:

                fmt.Println("<-c:", <-c)

                fmt.Println("<-c:", <-c)

        }

}

据我所知,应该发生的情况是:两个 goroutine 生成并写入同一个通道,其中一个阻塞并等待主 goroutine 读取。


但我不明白第二个 goroutine 会发生什么。它是否会阻塞,因为通道是无缓冲的,并且它在设计上不能容纳两个值。


有了这篇文章,我陷入了僵局。我在这里发现了类似的问题。


如果是这样,那么这段代码是如何运行的呢?

package main


import "fmt"


func main() {

        c := make(chan int)

        go func(){

                c <- 1

        }()

        go func(){

                c <- 2

        }()

        select {

        case forget := <-c:

                fmt.Println("forget:", forget)

                fmt.Println("<-c:", <-c)

        }

}


守候你守候我
浏览 63回答 1
1回答

弑天下

好吧,看起来像使用case <-c实际从通道读取的内容,而不是简单地检查它是否具有我想象的值。
打开App,查看更多内容
随时随地看视频慕课网APP