運行 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
2018-06-27
經過測試找到問題了,原文中用
這種寫法,在 for 循環到最后, ch 沒有數據時,程序死鎖。
2018-06-27
我將接收部分修改為以下,就可以了,不過很奇怪為什么老師的 5000 個,沒有出現死鎖。