go - 有什么方法可以检查值是否缓冲在 Go chan 中?

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

最佳答案

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

        }
}

编辑:修复了作用域错误。

关于go - 有什么方法可以检查值是否缓冲在 Go chan 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951344/

相关文章:

Golang : reflect. DeepEqual 返回 false

go - 获取循环的大缓冲 channel block 的长度

c# - 如何静音或只选择一个音频 channel ?

http - PUT 使用流和进度上传文件的字节范围

go - gorm rest API 中的模式搜索

elasticsearch - 如何使用golang将数据导入elasticsearch

Go:改造 channel

emacs - 检查当前 Emacs 缓冲区是否包含字符串

c - 在十六进制中搜索特定字节

javascript - 使用 express js 在浏览器中显示 Pdf