package main import ( "fmt" ) func main() { ch := make(chan string) for i := 0; i < 5; i++ { go printHello(i, ch) } for { message := <-ch fmt.Println(message) } } func printHello(i int, ch chan string) { message := fmt.Sprintf("groutine %d send u message", i) fmt.Println(message) ch <- message }
以上是我运行的代码,执行结果:
fatal error: all goroutines are asleep - deadlock! groutine 4 send u message groutine 4 send u message goroutine 1 [chan receive]: groutine 1 send u message main.main() groutine 1 send u message groutine 0 send u message /Users/donng/go/src/practice/cmd/hello-world/main.go:14 +0x9e groutine 2 send u message
经过测试找到问题了,原文中用
for { message := <-ch fmt.Println(message) }
这种写法,在 for 循环到最后, ch 没有数据时,程序死锁。
我将接收部分修改为以下,就可以了,不过很奇怪为什么老师的 5000 个,没有出现死锁。
go func(ch chan string) { for { message := <-ch fmt.Println(message) } }(ch)