go Context

  • 根 Context: 通过 context.Background() 创建
  • 子 Context: context.WithCancel(parentContext) 创建
1
ctx, cancel := context.WithCancel(context.Background())
  • 当前 context 被取消时 基于它的子 context 都会被取消

  • 接受取消通知 <- ctx.Done()

  • 示例代码

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
package cancel

import (
"context"
"fmt"
"testing"
"time"
)

func isCancelled(ctx context.Context) bool {
select {
case <-ctx.Done():
return true
default:
return false
}
}

func TestCancel(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(i int, ctx context.Context) {
for {
if isCancelled(ctx) {
break
}
time.Sleep(time.Millisecond * 5)
}
fmt.Println(i, "Cancelled")
}(i, ctx)
}
cancel()
time.Sleep(time.Second * 1)
}