Checking if a channel has a ready-to-read value, using Go

gonewbgo picture gonewbgo · Aug 3, 2010 · Viewed 45.8k times · Source

How do I check whether a channel has a value for me to read?

I don't want to block when reading a channel. I want to see whether it has a value. If it does have one, I'll read it. If it doesn't have one (yet), I'll do something else and check back again later.

Answer

Deleplace picture Deleplace · Dec 30, 2012

The only non-blocking operation I know of to read from a channel is inside a select block having a default case :

    select {
    case x, ok := <-ch:
        if ok {
            fmt.Printf("Value %d was read.\n", x)
        } else {
            fmt.Println("Channel closed!")
        }
    default:
        fmt.Println("No value ready, moving on.")
    }

Please try the non-blocking here

Note about previous answers: the receive operator itself is now a blocking operation, as of Go 1.0.3 . The spec has been modified. Please try the blocking here (deadlock)