根据 select 用法,向无缓冲通道写入两次会导致不同的结果。为什么?

Writing twice to an unbuffered channel lead to different results depending on the select usage. Why?

考虑两个例子:

第一个:

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 会发生什么。它是否因为通道没有缓冲而阻塞,并且它 不能 通过 design.

保存两个值

这篇文章让我陷入僵局。我发现了一个类似的问题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 实际上是从通道中读取的,而不是像我想的那样简单地检查它是否具有值。