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

golang频道无法消费或发布

golang频道无法消费或发布

Go
侃侃无极 2021-08-23 16:07:31
在我下面的代码中,只是整个代码的一部分。我初始化了一个频道,该频道无法消费或发布。我不知道是什么导致了这种情况。//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

但是,在不了解您想要实现的目标的情况下,我不能保证这会解决您的所有问题。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信