context.Context用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与Goroutine有非常密切的关系。

1type Context interface{
2  Deadline()(deadline time.Time, ok bool)
3  Done() <-chan struct{}
4  Err() error
5  Value(key interface{}) interface{}
6}

context.Context有四个方法:

  • Deadline() 返回context.Context被取消时间,也就是完成工作的截止日期;

  • Done() 返回一个channel,这个channel 会在当前工作完成或者上下文被取消后关闭,多次调用Done方法返回的是同一个channel;

  • Err() 返回context.Context 结束的原因,它只会在Done返回的Channel被关闭时才会返回非空的值

  • 如果 context.Context 被取消,会返回Canceled错误;

  • 如果 context.Context 超时,会返回DeadlineExceeded错误;

  • Value 从context.Context 中获取键对应的值。对同一个上下文来说,多次调用value并传入相同的key会返回相同的结果,该方法用来传递请求特定的数据。

1func main() {
2	ctx := context.Background() // new empty context
3
4	ctx = context.WithValue(ctx, "org", "ali")
5	ctx, _ = context.WithCancel(ctx)
6	ctx, _ = context.WithDeadline(ctx, time.Now().Add(10*time.Second))
7	ctx, _ = context.WithTimeout(ctx, time.Second)
8
9}

参考文档:

https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-context/