【问题标题】:Is there any way to check if values are buffered in a Go chan?有什么方法可以检查值是否在 Go chan 中缓冲?
【发布时间】:2013-07-30 20:31:02
【问题描述】:

我怎样才能执行以下操作?:

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

【问题讨论】:

    标签: go buffer channel goroutine


    【解决方案1】:
    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)
                    }
    
            }
    }
    

    编辑:修复范围错误。

    【讨论】:

    • 我认为这有一个小错误,当你点击 DoSomethingWith 时,c 和 ok 已经超出范围,你必须在选择之外用“var”预先声明它们并使用“= " 而不是 := 在 select 语句中。
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2010-09-30
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多