在Go中,如果我尝试从 channel 接收,程序的执行将停止,直到该 channel 中有一些值为止。但是,我想做的是让程序继续执行,如果 channel 中有值,请对其执行操作。
我想到的伪代码是这样的:
mychan := make(chan int, 1)
go someGoRoutine(mychan) // This might put some value in mychan at some point
for {
if something in "mychan" {
// Remove the element from "mychan" and process it
} else {
// Other code
}
}
据我了解,我不能简单地使用
v <- mychan
,因为那样会阻塞程序执行,直到有一个值可用为止。在Go中执行此操作的方式是什么? 最佳答案
这就是select的用途。例如:
for {
select {
case v := <-c1:
// process v
case v, ok := <-c2:
// Second form, '!ok' -> c2 was closed
default:
// receiving was not done
}
}