取法其上,得乎其中;取法其中,得乎其下。
一、基础
上下文Context是由Golang官方开发的并发控制包,1.7+才支持,它可以在不同的Goroutine之间同步请求数据,同时也能优雅地设置超时及信号来结束上下文。
需要实现的方法
- Deadline() (deadline time.Time, ok bool):如果有截止时间则返回对应deadline时间,如果没有则ok的值为false。
- Done() <-chan struct{}:一般通过close channel来进行通知,不会涉及具体数据传输
- Err() error:如果上面的Done()的channel未被close则error为nil,如果channel已被close则error将会返回close的原因,比如超时或手动取消。
- Value(key any) any:用来存储具体数据的方法。
使用原则
- 不要把context放到一个结构体中,应该作为第一个参数显式地传入函数
- 即使方法允许,也不要传入一个nil的context,如果不确定需要什么context的时候,传入一个context.TODO
- 使用context的Value相关方法应该传递和请求相关的元数据,不要用它来传递一些可选参数
- 同样的context可以传递到多个goroutine中,Context在多个goroutine中是安全的
- 在子context传入goroutine中后,应该在子goroutine中对该子context的Done channel进行监控,一旦该channel被关闭,应立即终止对当前请求的处理,并释放资源。