为什么在使用 select 并顺序将值输入 2 个通道时所有 goroutines 都在睡觉?

Why all goroutines are asleep when using select and sequentially feeding values into 2 channels?

我有 2 个通道,我在 main 函数的开头将值传递给它们,然后我有一个匿名 goroutine,它应该打印值:

package main

import (
    "fmt"
)

func main() {
    rand1 := make(chan int)
    rand2 := make(chan int)
    rand1 <- 5
    rand2 <- 7

    go func() {
        select {
        case <-rand1:
            fmt.Println("rand1")
        case <-rand2:
            fmt.Println("rand2")
            return
        }
        fmt.Println("test")
    }()
}

但是我收到错误 fatal error: all goroutines are asleep - deadlock!。但是当 rand2 通道收到它的值时,匿名 goroutine 应该 return。

写入通道将阻塞,直到另一个 goroutine 从中读取。在启动 reader goroutine 之前,您的程序正在尝试写入通道。先启动 reader goroutine,然后写入通道。

不是这样写的,goroutine 只会从其中一个通道读取 return,所以你的程序会再次死锁,因为第二次写入会阻塞。