Go 为什么还要恐慌;“通过封闭渠道发送”;当我在发送方关闭时?

Go 为什么还要恐慌;“通过封闭渠道发送”;当我在发送方关闭时?,go,channel,Go,Channel,我有一个stopChan通知发送者关闭频道,还有一个同步。有一次确保只有一个发送者可以关闭频道,但我仍然会收到“关闭频道发送”恐慌,为什么 func muitiSenderClose(){ 常数SenderNum=3 wg:=sync.WaitGroup{} 工作组添加(发送人) intChan:=制造(chan int) stopChan:=make(chan结构{}) once:=同步。once{} 对于i:=0;i

我有一个
stopChan
通知发送者关闭频道,还有一个
同步。有一次
确保只有一个发送者可以关闭频道,但我仍然会收到“关闭频道发送”恐慌,为什么

func muitiSenderClose(){
常数SenderNum=3
wg:=sync.WaitGroup{}
工作组添加(发送人)
intChan:=制造(chan int)
stopChan:=make(chan结构{})
once:=同步。once{}
对于i:=0;icase
go
并发非常强大。协调并发非常困难。幸运的是,
go
标准库有许多工具可以帮助您完成这项工作。您可能应该熟悉
上下文

context.context
在封面下使用done频道(类似于您的
stopChan
),但也有其他机制,如取消链接。它们也在整个
go
标准库中用于http、数据库和其他阻塞类型请求

正如@JimB所提到的,通常在协调制作人/消费者时很少需要
sync.Once
chan
s和
sync.WaitGroup
s通常就足够了

无论如何,下面是使用
context.context对代码的协调修复:


在所有发送方完成后关闭频道。您需要进行
同步的事实。一旦关闭频道
就表明它位于错误的位置。您还有一个数据竞争,请始终使用竞争检测器进行检查。您有多个goroutine都在
intChan
上发送。它们无法全部关闭。发送方共享一个c通道需要等待所有发送方完成发送后才能关闭。