gpt4 book ai didi

golang channel 无法消费或发布

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:01 26 4
gpt4 key购买 nike

在我下面的代码中,只是整个代码的一部分。我启动了一个 channel ,该 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 <-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?

结论:channel的block和unblock,没看清楚。select{} expr keyword 'default',我没搞清楚。这就是我的程序没有运行的原因。

谢谢@jimt,我完成了这个问题。

最佳答案

我不确定您要实现的目标。但是您的示例代码保证会阻塞 select 语句。

选择的 default 情况用于在 channel 上的特定读取或写入不成功时提供回退。这意味着在您的代码中,始终执行默认情况。在选择开始之前,没有任何值被写入 channel ,因此 case 语句永远不会运行。

default 情况下的代码永远不会成功并无限期地阻塞,因为 channel 中没有空间来存储值并且没有其他人在任何其他 goroutine 中读取它。

解决您当前问题的一个简单方法是:

stopSvr=make(chan bool, 1) // 1 slot buffer to store a value

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

关于golang channel 无法消费或发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com