Go 当通道被阻塞时,为什么select语句抛出错误

Go 当通道被阻塞时,为什么select语句抛出错误,go,Go,在本例中,通道已满,因此select语句中的第一个案例将被阻塞,导致打印默认案例。或者至少我认为应该这样。相反,我得到的错误是“所有goroutines都处于休眠状态-死锁!”。为什么会这样?我认为select语句会一直阻塞,直到其中一个案例可以运行为止,这是本例中的默认案例 func main() { c := make(chan int) c <- 1 select { case c <- 5:

在本例中,通道已满,因此select语句中的第一个案例将被阻塞,导致打印默认案例。或者至少我认为应该这样。相反,我得到的错误是“所有goroutines都处于休眠状态-死锁!”。为什么会这样?我认为select语句会一直阻塞,直到其中一个案例可以运行为止,这是本例中的默认案例

 func main() {
        c := make(chan int)
        c <- 1
    
        select {
            case c <- 5:
                fmt.Println("a")
            default:
                fmt.Println("only case not blocked")
            // fatal error: all goroutines are asleep - deadlock!
    }
    }
func main(){
c:=制造(成交量)

c执行甚至没有到达select语句,因为在此之前它是死锁的。您试图发送到刚刚创建的通道,但它没有缓冲-没有任何内容可从中读取。因此程序死锁,正确地告诉您所有goroutine都被阻止。在select之前删除发送,您将看到预期的结果havior.

频道用于goroutines通信。 当通道已满时,发送方将等待另一个goroutine接收该通道

无缓冲通道总是满的:必须有另一个goroutine来接收发送方(同时)发送的内容

在本部分中,您将写入一个通道:

c <- 1

c紧急消息显示程序被阻止的位置:
c
case c <- 5:
package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)
    go func() {
        fmt.Println(<-c) // starting goroutine and continuously reading from chan "c"
    }()

    time.Sleep(time.Millisecond) //to let goroutine start before program ends

    select {
    case c <- 5: // write into the channel so goroutine can read
        fmt.Println("a")
    default:
        fmt.Println("only case not blocked")
    }
    time.Sleep(time.Millisecond) //to let goroutine start before program finishes
}