简短的版本:是否有一种方法可以清空一个go通道而不重新创建它,或者循环它?
原因:我使用两个通道来发送和接收数据,并且我有一个额外的通道来表示需要重新连接。
现在,当传输被重置/重新连接时,我想要“清空”额外的通道,以确保没有任何其他的重置请求会导致再次连接。
发布于 2014-10-01 14:17:14
你所描述的本质上是充满活力的,因为可能有合法的请求在频道上重新连接。与其试图耗尽频道,我建议保持时间的跟踪。
在你的重新连接频道,张贴时间。当重新连接完成后,请注意时间。在使用重新连接通道时,丢弃任何比上次重新连接更早的消息。
要实现这一点,另一个更简单的解决方案是使重新连接通道成为bool。发布“真”以重新连接。当重新连接完成后,发布"false“。然后使用该频道,直到找到“false”为止。
发布于 2014-10-01 14:03:50
如果没有循环,就不可能清空信道。如果您没有任何并发接收者,则可以使用以下简单循环:
for len(ch) > 0 {
<-ch
}如果您有并发接收者,则使用循环:
L:
for {
select {
case <-c:
default:
break L
}
}发布于 2022-09-18 21:18:15
不能编辑Simon Fox的答案,所以在这里写:
如果陈关闭,那就会有无限的循环。
更安全的版本(句柄关闭陈):
L:
for {
select {
case _, ok := <-ch:
if !ok { //closed
break L
}
default:
break L
}
}https://stackoverflow.com/questions/26143091
复制相似问题