有没有办法检查Go chan中是否缓冲了值?

时间:2013-07-30 15:33:49

标签: go buffer channel goroutine

我该如何做以下事情?:

func foo(input <-chan char, output chan<- string) {
    var c char
    var ok bool
    for {
        if ThereAreValuesBufferedIn(input) {
            c, ok = <-input
        } else {
            output <- "update message"
            c, ok = <-input
        }
        DoSomethingWith(c, ok) 
    }
}

基本上,我想检查chan中是否有缓冲值,这样如果没有,我可以在线程被阻止之前发送更新消息。

3 个答案:

答案 0 :(得分:3)

是的,这是select电话允许您这样做的内容。它将使您能够检查一个或多个通道以准备读取值。

答案 1 :(得分:3)

package main

func foo(input <-chan char, output chan<- string) {
        for {
                select {
                case c, ok := <-input:
                        if ok { // ThereAreValuesBufferedIn(input)
                                ... process c
                        } else { // input is closed
                                ... handle closed input
                        }
                default:
                        output <- "update message"
                        c, ok := <-input // will block
                        DoSomethingWith(c, ok)
                }

        }
}

编辑:修正了范围错误。

答案 2 :(得分:1)

其他人已经回答了你的问题,你想用你的代码做什么(使用select),但为了完整起见,并回答问题标题所提出的具体问题(“有什么办法吗?”检查值是否在Go chan中缓冲?“),lencap内置函数在缓冲通道上按预期工作(len返回缓冲元素的数量,{ {1}}返回频道的最大容量。)

http://tip.golang.org/ref/spec#Length_and_capacity