如何明确清空频道?

Toa*_*oad 8 go channels

简短的版本:有没有办法清空go通道而不重新创建它,或循环通过它?

原因是:我使用两个通道来发送和接收数据,我还有一个额外的通道来表示需要重新连接.

现在,当传输重置/重新连接时,我想"清空"额外的通道,以确保没有任何延迟的其他重置请求,这将导致该事件再次重新连接.

Sim*_*Fox 19

没有循环就无法清空通道.如果你没有任何并发​​接收器,那么你可以使用这个简单的循环:

for len(ch) > 0 {
  <-ch
}
Run Code Online (Sandbox Code Playgroud)

如果你有并发接收器,那么使用循环:

L:
for {
    select {
    case <-c:
    default:
       break L
    }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ier 8

您所描述的内容本质上是活泼的,因为频道上可能存在重新连接的合法请求。我建议不要试图耗尽渠道,而是跟踪时间。

在您的重新连接频道上发布时间。重新连接完成后,记下时间。在使用重新连接通道时,丢弃早于上次重新连接的所有消息。

实现此目的的另一个更同步的解决方案是将重新连接通道设置为布尔值。发布“true”以重新连接。重新连接完成后,发布“false”。然后消耗该通道,直到发现“假”。

  • 我喜欢时间戳方法。它仍在通道中循环,但在这种情况下,你是对的,至少我不能意外删除任何新的请求 (2认同)