golang频道无法消费或发布

在我下面的代码中,只是整个代码的一部分。我初始化了一个频道,该频道无法消费或发布。我不知道是什么导致了这种情况。


//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?

结论:通道的阻塞和解除阻塞,我不是很清楚。select{} expr 关键字'default',我不是很清楚。这就是为什么我的程序没有运行的原因。


侃侃无极
浏览 184回答 1
1回答

摇曳的蔷薇

我不确定你想要达到的目标。但是您的示例代码保证会阻塞在 select 语句上。default选择的情况用于在通道上的特定读取或写入不成功时提供回退。这意味着在您的代码中,始终执行默认情况。在选择开始之前没有值被写入通道,因此该case语句永远不会运行。这种default情况下的代码永远不会成功并无限期地阻塞,因为通道中没有空间来存储值,并且没有其他人在任何其他 goroutine 中读取它。您当前问题的简单解决方案是:stopSvr=make(chan&nbsp;bool,&nbsp;1)&nbsp;//&nbsp;1&nbsp;slot&nbsp;buffer&nbsp;to&nbsp;store&nbsp;a&nbsp;value但是,在不了解您想要实现的目标的情况下,我不能保证这会解决您的所有问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go