package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
go func() {
fmt.Println("hello")
c <- 10
}()
time.Sleep(2 * time.Second)
}
在以上程序中,我创建了一个Go例程,该例程正在写入 channel c,但是没有其他go例程正在从该 channel 读取。为什么在这种情况下没有僵局?
最佳答案
死锁意味着所有goroutine被阻止,而不仅仅是您选择的任意goroutine。main
goroutine只是处于 sleep 状态,一旦结束,它便可以继续运行。
如果使用永久阻止sleep
的方式切换select{}
,则会出现死锁:
c := make(chan int)
go func() {
fmt.Println("hello")
c <- 10
}()
select {}
在Go Playground上尝试一下。
参见相关:Why there is no error that receiver is blocked?
关于go - 转到 channel 死锁未发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61655436/