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上阻塞了