Timeout reading from a channel with select

suggest change

Receiving from a channel with <- chan or for range loop blocks.

Sometimes you want to limit time waiting for a value on a channel.

It’s possible with select:

func main() {
	chResult := make(chan int, 1)

	go func() {
		time.Sleep(1 * time.Second)
		chResult <- 5
		fmt.Printf("Worker finished")
	}()

	select {
	case res := <-chResult:
		fmt.Printf("Got %d from worker\n", res)
	case <-time.After(100 * time.Millisecond):
		fmt.Printf("Timed out before worker finished\n")
	}
}
Timed out before worker finished

Let's dig into how this works:

select {
	case res := <-chResult:
		fmt.Printf("Got %d from worker\n", res)
	case <-time.After(100 * time.Millisecond):
		fmt.Printf("Timed out before worker finished\n")
}

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:



Table Of Contents