我该如何做以下事情?:
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中是否有缓冲值,这样如果没有,我可以在线程被阻止之前发送更新消息。
答案 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中缓冲?“),len
和cap
内置函数在缓冲通道上按预期工作(len
返回缓冲元素的数量,{ {1}}返回频道的最大容量。)