在 Go select 构造中,我可以在两个 case 语句中发送和接收到无缓冲通道吗?

Gur*_* GV 3 go

我期待这段代码进入无限循环,发送和接收消息。但它似乎既不发送也不接收。为什么?

go func() {
    for {
        select {
        case ch1 <- 1:
            println("sent 1 ")
        case c := <-ch1:
            println(" received ", c)
        }
        time.Sleep(time.Second)
    }
}()
Run Code Online (Sandbox Code Playgroud)

Cer*_*món 11

通道的文件说

如果容量为零或不存在,则通道没有缓冲,只有当发送方和接收方都准备好时,通信才能成功。

选择文件说

如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。

接收案例无法继续,因为没有准备好的发件人。发送案例无法继续,因为没有准备好的接收者。程序在选择中死锁。

单个 goroutine 不能使发送和接收都准备好,因为 goroutine 一次只能执行选择的一个分支。

如果通道被缓冲,程序将永远循环(playground 示例)。