2 回答
TA贡献1735条经验 获得超5个赞
你遇到死锁的原因是break你select唯一的内部打破了select,让for循环自由地重新进入选择,没有一个通道准备好从中读取。
您可以通过执行以下操作来挽救它:
done := false
for !done {
select {
...
case <-chClose:
done = true
fmt.Println("CLOSED")
}
}
这很for容易让循环终止。
另一种是使用标签:
OuterLoop:
for {
select {
...
case <-chClose:
fmt.Println("CLOSED")
break OuterLoop
}
}
在这种情况下,我个人对第一个版本有一点偏好,但这只是个人喜好问题。
TA贡献1798条经验 获得超3个赞
你break
在你的程序结束时只打破select
(并再次进入循环,因此陷入僵局):用return
工作正常替换它:https : //play.golang.org/p/j5bDaj3z7y
事实上,从规格:
“break”语句会终止同一个函数中最里面的“for”、“switch”或“select”语句的执行。
您可以通过return
(如我所做的)、goto 或其他一些架构重构来解决这个问题。
至于无限循环,也是同样的问题,而不是封闭通道总是返回,所以当break
退出 时select
,你进入循环,并nil
永远从封闭通道接收s
- 2 回答
- 0 关注
- 181 浏览
添加回答
举报