为啥以下代码会产生deadlock?

linture · · 356 次点击 · 开始浏览    置顶
``` import ( "fmt" ) func main() { AlterPrint() } // POINT: communicate between goroutines by channel func AlterPrint(){ letter, number := make(chan bool), make(chan bool) letterDone := make(chan bool) numberDone := make(chan bool) go func() { i := 1 for { if i > 28 { numberDone <- true return } select{ case <-number: { fmt.Print(i) i++ fmt.Print(i) i++ letter <- true break } default: { break } } } }() go func(){ i := 'A' for { if i > 'Z' { letterDone <- true return } select{ case <-letter: { fmt.Print(string(i)) i++ fmt.Print(string(i)) i++ number <- true break } default: { break } } } }() number <- true <- letterDone <- numberDone } ``` I expect the output of "12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728", but the actual output is ``` goroutine 1 [chan receive]: main.AlterPrint() /tmp/54841538.go:66 +0x183 main.main() /tmp/54841538.go:7 +0x14 goroutine 5 [chan send]: main.AlterPrint.func1(0xc82000c240, 0xc82000c180, 0xc82000c120) /tmp/54841538.go:31 +0x25a created by main.AlterPrint /tmp/54841538.go:40 +0xde exit status 2 ```

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

356 次点击  
加入收藏 微博
3 回复  |  直到 2019-08-26 10:38:12
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传