用Go的select语句仔细检查

时间:2018-01-08 17:01:56

标签: go

我正在学习Golang,在Go的博客上阅读this post后,我有以下问题。

我从以下代码开始(来自帖子):

select {
case <-ch:
    // a read from ch has occurred
case <-timeout:
    // the read from ch has timed out
}

基于A Tour of Go状态:

  

......如果有多个准备就绪,它会随机选择一个。

据我所知,可以让我的结果准备好并同时超时。我的问题是在默认情况下是否值得(或正确)重复检查。

如下所示:

select {
case <-ch:
    // a read from ch has occurred
case <-timeout:
    // the read from ch has timed out

    // So check ch one last time
    select {
    case <-ch:
        // a read from ch has occurred at same time of a timeout,
        // so ignore the timeout
    default:
        // definitive timeout
    }
}

1 个答案:

答案 0 :(得分:1)

如果其中一个频道是超时,你的工作完成的几率和完全同时的超时发射是如此之小,他们没有理由考虑。

陈述&#34; ......如果多个准备就绪,它随机选择一个。&#34;当你确实有可行的理由发生这种情况时适用 - 例如,如果你在多个工作渠道上有一个选择案例,你可以用一个goroutine进行处理。