首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何显式地清空一个通道?

问我如何显式地清空一个通道?
EN

Stack Overflow用户
提问于 2014-10-01 13:54:41
回答 4查看 36.6K关注 0票数 24

简短的版本:是否有一种方法可以清空一个go通道而不重新创建它,或者循环它?

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

现在,当传输被重置/重新连接时,我想要“清空”额外的通道,以确保没有任何其他的重置请求会导致再次连接。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-01 14:17:14

你所描述的本质上是充满活力的,因为可能有合法的请求在频道上重新连接。与其试图耗尽频道,我建议保持时间的跟踪。

在你的重新连接频道,张贴时间。当重新连接完成后,请注意时间。在使用重新连接通道时,丢弃任何比上次重新连接更早的消息。

要实现这一点,另一个更简单的解决方案是使重新连接通道成为bool。发布“真”以重新连接。当重新连接完成后,发布"false“。然后使用该频道,直到找到“false”为止。

票数 7
EN

Stack Overflow用户

发布于 2014-10-01 14:03:50

如果没有循环,就不可能清空信道。如果您没有任何并发接收者,则可以使用以下简单循环:

代码语言:javascript
复制
for len(ch) > 0 {
  <-ch
}

如果您有并发接收者,则使用循环:

代码语言:javascript
复制
L:
for {
    select {
    case <-c:
    default:
       break L
    }
}
票数 39
EN

Stack Overflow用户

发布于 2022-09-18 21:18:15

不能编辑Simon Fox的答案,所以在这里写:

如果陈关闭,那就会有无限的循环。

​

更安全的版本(句柄关闭陈):

代码语言:javascript
复制
L:
    for {
        select {
        case _, ok := <-ch:
            if !ok { //closed
                break L
            }
        default:
            break L
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26143091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档