企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> # channel 死锁 > ### 例子一 - 死锁 ~~~ package main func main() { ch := make(chan int) ch <- 1 //channel 长度为0, 发送阻塞, 死锁 println(<-ch) } ~~~ - 不会死锁 ~~~ package main func main() { ch := make(chan int, 1) ch <- 1 //channel 长度为0, 发送阻塞, 死锁 println(<-ch) } ~~~ > ### 例子二 - fatal error: all goroutines are asleep - deadlock! ~~~ package main import ( "fmt" ) func main() { ch := make(chan int) Receive(ch) } // 限制只能发送 func Receive(ch <-chan int) { fmt.Println(<-ch) } // 限制只能接收 func Send(ch chan<- int) { ch <- 1 } ~~~ - Go 语言的调度器会检测死锁,如果主 Goroutine 和所有其他 Goroutine 都处于等待状态而没有继续执行的代码,则程序会崩溃并提示死锁错误。 - 主 Goroutine 死锁, 其它Goroutine 没死锁还能正常运行 ~~~ package main import ( "fmt" "time" ) func main() { go func() { for { fmt.Println(1) time.Sleep(time.Second) } }() ch := make(chan int) Receive(ch) } // 限制只能发送 func Receive(ch <-chan int) { fmt.Println(<-ch) } // 限制只能接收 func Send(ch chan<- int) { ch <- 1 } ~~~