golang频道无法消费或发布
在我下面的代码中,只是整个代码的一部分。我初始化了一个频道,该频道无法消费或发布。我不知道是什么导致了这种情况golang频道无法消费或发布,go,channel,Go,Channel,在我下面的代码中,只是整个代码的一部分。我初始化了一个频道,该频道无法消费或发布。我不知道是什么导致了这种情况 //init at the beginning of program var stopSvr chan bool stopSvr=make(chan bool) var stopSvrDone chan bool stopSvrDone=make(chan bool) //somewhere use,in a goroutine select{ case <-stopS
//init at the beginning of program
var stopSvr chan bool
stopSvr=make(chan bool)
var stopSvrDone chan bool
stopSvrDone=make(chan bool)
//somewhere use,in a goroutine
select{
case <-stopSvr:
stopSvrDone<-true
fmt.Println("son svr exit")
default:
//do its job
}
//somewhere use,in a goroutine
stopSvr <- true //block here
<-stopSvrDone
fmt.Println("svr exit")
//here to do other things,but it's blocked at "stopSvr<-true",
//what condition could make this happen?
结论:
频道的封锁和解除封锁,我不清楚。
选择{}expr关键字'default',我不清楚。
这就是为什么我的程序没有运行
谢谢@jimt,我完成了这个问题。我不确定你想达到什么目的。但是您的示例代码保证会阻塞select语句 select的默认情况用于在通道上的特定读取或写入失败时提供回退。这意味着在代码中,始终执行默认情况。在select开始之前,没有任何值写入通道,因此case语句永远不会运行 默认情况下的代码永远不会成功并无限期阻塞,因为通道中没有空间来存储值,并且没有其他人在任何其他goroutine中读取该值 解决眼前问题的简单方法是:
stopSvr=make(chan bool, 1) // 1 slot buffer to store a value
但是,如果不了解您想要实现的目标,我无法保证这将解决您所有的问题。很抱歉,我没有很好地描述我的问题,现在我解决了它。我真的不知道如何找到答案,因为我真的开始使用go很短时间@jimtIt还不是很清楚。。但是你的代码现在在stopSvrDone上阻塞了