在我下面的代码中,只是整个代码的一部分。我初始化了一个频道,该频道无法消费或发布。我不知道是什么导致了这种情况。//init at the beginning of programvar stopSvr chan boolstopSvr=make(chan bool)var stopSvrDone chan boolstopSvrDone=make(chan bool)//somewhere use,in a goroutineselect{ case <-stopSvr: stopSvrDone<-true fmt.Println("son svr exit") default: //do its job}//somewhere use,in a goroutinestopSvr <- true //block here<-stopSvrDonefmt.Println("svr exit")//here to do other things,but it's blocked at "stopSvr<-true",//what condition could make this happen?结论:通道的阻塞和解除阻塞,我不是很清楚。select{} expr 关键字'default',我不是很清楚。这就是为什么我的程序没有运行的原因。
1 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
我不确定你想要达到的目标。但是您的示例代码保证会阻塞在 select 语句上。
default
选择的情况用于在通道上的特定读取或写入不成功时提供回退。这意味着在您的代码中,始终执行默认情况。在选择开始之前没有值被写入通道,因此该case
语句永远不会运行。
这种default
情况下的代码永远不会成功并无限期地阻塞,因为通道中没有空间来存储值,并且没有其他人在任何其他 goroutine 中读取它。
您当前问题的简单解决方案是:
stopSvr=make(chan bool, 1) // 1 slot buffer to store a value
但是,在不了解您想要实现的目标的情况下,我不能保证这会解决您的所有问题。
- 1 回答
- 0 关注
- 177 浏览
添加回答
举报
0/150
提交
取消