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

标签 go channels

考虑两个例子:

第一:

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 生成并写入同一个 channel ,其中一个阻塞并等待主 goroutine 读取。

但我不明白第二个 goroutine 会发生什么。它是否因为 channel 没有缓冲而阻塞,并且它 不能通过 保存两个值设计 .

有了这篇文章,我陷入了僵局。我发现了一个类似的问题 here .

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

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)
        }
}

最佳答案

好的,看起来像使用 case <-c实际上是从 channel 读取的,而不是像我想的那样简单地检查它是否具有值。

关于go - 根据选择的使用情况,向无缓冲 channel 写入两次会导致不同的结果。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675464/

相关文章:

go - 我如何解决无法引用 golang 中未导出的字段或方法 models.Model.getDevices

go - 使用多个 goroutines 写入同一个 channel

go - 如何在 Golang for windows 中以编程方式更改应用程序优先级?

go - 如何使用go lang下载并保存整个网页

go - 为什么在解码后我得到不同的字节数但在编码后得到相同的结果?

websocket - 如何检测用户是否因网络断开而离开 Phoenix channel ?

multithreading - Rust By Example 中的 channel 如何工作?

google-app-engine - GAE Golang - OAuth 和 OAuth2?

django - 不断地从服务器向客户端发送数据

java - 通过 ReadableByteChannel 的 InputStream 没有读到结束