Go select语句中的条件情况

时间:2017-11-21 16:09:53

标签: go

我正在尝试在Go中编写一个包含可选超时的select,如下所示:

done := false

for !done {
    if timeout > 0 {
        select {
        case value := <- somechannel:
            // Do something with value
        case <- time.After(timeout):
            done = true
        }
    } else {
        select {
        case value := <- somechannel:
            // Do something with value
        default:
            done = true
        }
    }
}

也就是说,如果频道上没有待处理的内容,并且我没有设置超时,我退出。如果设置了超时并且没有任何可用,那么我会等待超时或通道上的某些内容。我喜欢将它组合成一个选择,但我看不出我能做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

以下是我将如何实现您想要的内容:

func foo() {
    if timeout > 0 {
        timer := time.NewTimer(timeout)
        defer timer.Stop()

    wait:
        for {
            select {
            case value := <-somechannel:
                // Do something with value
            case <-timer.C:
                break wait
            }
        }
    } else {
    drain:
        for {
            select {
            case value := <-somechannel:
                // Do something with value
            default:
                break drain
            }
        }
    }
}

第一个循环是正常消耗,直到超时。第二个循环消失,直到没有立即可用。