为了账号安全,请及时绑定邮箱和手机立即绑定

运行 deadlock

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


正在回答

2 回答

经过测试找到问题了,原文中用

   for {     
    message := <-ch      
    fmt.Println(message)   
   }

这种写法,在 for 循环到最后, ch 没有数据时,程序死锁。

1 回复 有任何疑惑可以回复我~

我将接收部分修改为以下,就可以了,不过很奇怪为什么老师的 5000 个,没有出现死锁。

go func(ch chan string) {
   for {
      message := <-ch
      fmt.Println(message)
   }
}(ch)


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

运行 deadlock

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信