我是新手。当我注释掉第二个goroutine时,出现致命错误。我不明白是什么原因导致此错误发生。你能跟我解释一下吗?
package main import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { for i := 0; i < 10; i++ { ch <- i } } () // go func() { for { if num, ok := <-ch; !ok { break } else { fmt.Printf("%d\n", num) } } // } () time.Sleep(2 * time.Second) close(ch) }
这将输出以下代码:
0 1 2 3 4 5 6 7 8 9 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /tmp/sandbox169127128/main.go:17 +0xa0 Program exited.
ch从发送goroutine接收到所有值之后,receive的for循环块将在接收时被阻塞。运行时检测到程序被卡住并出现紧急情况。
ch
解决方法是在发送所有值后关闭通道:
go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) } ()
在闭路接收产生值0, false。for循环的接收会中断false值。
0, false
close(ch)从程序末尾删除。
close(ch)
在操场上跑。