1

我怎样才能做类似以下的事情?:

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 中是否有缓冲值,如果没有,我可以在线程被阻塞之前发送更新消息。

4

3 回答 3

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)
                }

        }
}

EDIT: Fixed scoping bug.

于 2013-07-30T15:40:59.903 回答
3

是的,这就是select调用允许您执行的操作。它将使您能够检查一个或多个通道以获取准备读取的值。

于 2013-07-30T15:38:28.707 回答
1

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

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

于 2013-07-30T18:05:47.357 回答