0%

Go语言上下文

取法其上,得乎其中;取法其中,得乎其下。

一、基础

      上下文Context是由Golang官方开发的并发控制包,1.7+才支持,它可以在不同的Goroutine之间同步请求数据,同时也能优雅地设置超时及信号来结束上下文。

  1. 需要实现的方法

    • 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:用来存储具体数据的方法。
  2. 使用原则

    • 不要把context放到一个结构体中,应该作为第一个参数显式地传入函数
    • 即使方法允许,也不要传入一个nil的context,如果不确定需要什么context的时候,传入一个context.TODO
    • 使用context的Value相关方法应该传递和请求相关的元数据,不要用它来传递一些可选参数
    • 同样的context可以传递到多个goroutine中,Context在多个goroutine中是安全的
    • 在子context传入goroutine中后,应该在子goroutine中对该子context的Done channel进行监控,一旦该channel被关闭,应立即终止对当前请求的处理,并释放资源。

二、使用

三、参考

  1. 参考一
  2. 参考二