-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimeouts.go
More file actions
45 lines (43 loc) · 1 KB
/
Copy pathtimeouts.go
File metadata and controls
45 lines (43 loc) · 1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main
import (
"fmt"
"time"
)
func main() {
/*
For our example, suppose we’re executing
an external call that returns its result on a channel c1 after 2s.
*/
c1 := make(chan string, 1)
go func() {
time.Sleep(time.Second * 2)
c1 <- "result 1"
}()
/*
Here’s the select implementing a timeout. res := <-c1 awaits the result and <-Time.After
awaits a value to be sent after the timeout of 1s. Since select proceeds
with the first receive that’s ready, we’ll take the timeout case if the
operation takes more than the allowed 1s.
*/
select {
case res := <-c1:
fmt.Println(res)
case <-time.After(time.Second * 1):
fmt.Println("timeout 1")
}
/*
If we allow a longer timeout of 3s,
then the receive from c2 will succeed and we’ll print the result.
*/
c2 := make(chan string, 1)
go func() {
time.Sleep(time.Second * 2)
c2 <- "result 2"
}()
select {
case res := <-c2:
fmt.Println(res)
case <-time.After(time.Second * 3):
fmt.Println("timeout 2")
}
}