如何从通道获取值而无需等待它

时间:2013-07-16 07:42:57

标签: multithreading asynchronous synchronization go goroutine

在Go中,如果我尝试从通道接收,程序的执行将被停止,直到某个值在通道中。但是,我想要做的是让程序继续执行,如果通道中有值,则对其进行操作。

我想到的伪代码是这样的:

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中这样做的方法是什么?

1 个答案:

答案 0 :(得分:8)

这就是select的用途。例如:

for {
        select {
        case v := <-c1:
                // process v
        case v, ok := <-c2:
                // Second form, '!ok' -> c2 was closed
        default:
                // receiving was not done
        }
}