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