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
:
https://codeeval.dev/gist/12ace93c5db6fa934ba022a212bbba47
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")
}
time.After
returns a channel on which a value will be enqueued after a given time (100 milliseconds in our example). It's worth nothing that it's at least 100 ms and can be more. Let's call it a timeout channel.select
to wait on 2 channels: chResult
and a timeout channelselect
finishes when receive on one of the 2 channels completeschResult
before timeout expires or we receive the value from timeout channel