为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守候你守候我 2023-07-31 16:50:00
考虑两个例子:第一:package mainimport "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 mainimport "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)        }}
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超7个赞

好吧,看起来像使用case <-c实际从通道读取的内容,而不是简单地检查它是否具有我想象的值。



查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信