Source file
src/context/example_test.go
1
2
3
4
5 package context_test
6
7 import (
8 "context"
9 "errors"
10 "fmt"
11 "net"
12 "sync"
13 "time"
14 )
15
16 var neverReady = make(chan struct{})
17
18
19
20
21 func ExampleWithCancel() {
22
23
24
25
26
27 gen := func(ctx context.Context) <-chan int {
28 dst := make(chan int)
29 n := 1
30 go func() {
31 for {
32 select {
33 case <-ctx.Done():
34 return
35 case dst <- n:
36 n++
37 }
38 }
39 }()
40 return dst
41 }
42
43 ctx, cancel := context.WithCancel(context.Background())
44 defer cancel()
45
46 for n := range gen(ctx) {
47 fmt.Println(n)
48 if n == 5 {
49 break
50 }
51 }
52
53
54
55
56
57
58 }
59
60
61
62 func ExampleWithDeadline() {
63 d := time.Now().Add(shortDuration)
64 ctx, cancel := context.WithDeadline(context.Background(), d)
65
66
67
68
69 defer cancel()
70
71 select {
72 case <-neverReady:
73 fmt.Println("ready")
74 case <-ctx.Done():
75 fmt.Println(ctx.Err())
76 }
77
78
79
80 }
81
82
83
84 func ExampleWithTimeout() {
85
86
87 ctx, cancel := context.WithTimeout(context.Background(), shortDuration)
88 defer cancel()
89
90 select {
91 case <-neverReady:
92 fmt.Println("ready")
93 case <-ctx.Done():
94 fmt.Println(ctx.Err())
95 }
96
97
98
99 }
100
101
102
103 func ExampleWithValue() {
104 type favContextKey string
105
106 f := func(ctx context.Context, k favContextKey) {
107 if v := ctx.Value(k); v != nil {
108 fmt.Println("found value:", v)
109 return
110 }
111 fmt.Println("key not found:", k)
112 }
113
114 k := favContextKey("language")
115 ctx := context.WithValue(context.Background(), k, "Go")
116
117 f(ctx, k)
118 f(ctx, favContextKey("color"))
119
120
121
122
123 }
124
125
126
127 func ExampleAfterFunc_cond() {
128 waitOnCond := func(ctx context.Context, cond *sync.Cond, conditionMet func() bool) error {
129 stopf := context.AfterFunc(ctx, func() {
130
131
132
133 cond.L.Lock()
134 defer cond.L.Unlock()
135
136
137
138
139
140
141
142
143
144 cond.Broadcast()
145 })
146 defer stopf()
147
148
149
150
151 for !conditionMet() {
152 cond.Wait()
153 if ctx.Err() != nil {
154 return ctx.Err()
155 }
156 }
157
158 return nil
159 }
160
161 cond := sync.NewCond(new(sync.Mutex))
162
163 var wg sync.WaitGroup
164 for i := 0; i < 4; i++ {
165 wg.Add(1)
166 go func() {
167 defer wg.Done()
168
169 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
170 defer cancel()
171
172 cond.L.Lock()
173 defer cond.L.Unlock()
174
175 err := waitOnCond(ctx, cond, func() bool { return false })
176 fmt.Println(err)
177 }()
178 }
179 wg.Wait()
180
181
182
183
184
185
186 }
187
188
189
190 func ExampleAfterFunc_connection() {
191 readFromConn := func(ctx context.Context, conn net.Conn, b []byte) (n int, err error) {
192 stopc := make(chan struct{})
193 stop := context.AfterFunc(ctx, func() {
194 conn.SetReadDeadline(time.Now())
195 close(stopc)
196 })
197 n, err = conn.Read(b)
198 if !stop() {
199
200
201 <-stopc
202 conn.SetReadDeadline(time.Time{})
203 return n, ctx.Err()
204 }
205 return n, err
206 }
207
208 listener, err := net.Listen("tcp", ":0")
209 if err != nil {
210 fmt.Println(err)
211 return
212 }
213 defer listener.Close()
214
215 conn, err := net.Dial(listener.Addr().Network(), listener.Addr().String())
216 if err != nil {
217 fmt.Println(err)
218 return
219 }
220 defer conn.Close()
221
222 ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
223 defer cancel()
224
225 b := make([]byte, 1024)
226 _, err = readFromConn(ctx, conn, b)
227 fmt.Println(err)
228
229
230
231 }
232
233
234
235 func ExampleAfterFunc_merge() {
236
237
238 mergeCancel := func(ctx, cancelCtx context.Context) (context.Context, context.CancelFunc) {
239 ctx, cancel := context.WithCancelCause(ctx)
240 stop := context.AfterFunc(cancelCtx, func() {
241 cancel(context.Cause(cancelCtx))
242 })
243 return ctx, func() {
244 stop()
245 cancel(context.Canceled)
246 }
247 }
248
249 ctx1, cancel1 := context.WithCancelCause(context.Background())
250 defer cancel1(errors.New("ctx1 canceled"))
251
252 ctx2, cancel2 := context.WithCancelCause(context.Background())
253
254 mergedCtx, mergedCancel := mergeCancel(ctx1, ctx2)
255 defer mergedCancel()
256
257 cancel2(errors.New("ctx2 canceled"))
258 <-mergedCtx.Done()
259 fmt.Println(context.Cause(mergedCtx))
260
261
262
263 }
264
View as plain text