go标准库-Context
Contents
go语言中文网有很多文档缺少内容比如string.Builder就没有,godoc绝对详尽,推荐阅读godoc
按官方的说法,子context是父context的一个copy
对服务器的传入请求应该创建一个上下文,对服务器的传出调用应该接受一个上下文。它们之间的函数调用链必须传播上下文,可选择将其替换为使用 WithCancel、WithDeadline、WithTimeout 或 WithValue 创建的派生上下文。当一个上下文被取消时,从它派生的所有上下文也被取消。
WithCancel、WithDeadline 和 WithTimeout 函数接收 Context(父级)并返回新的 Context(子级)及其 CancelFunc。
WithCancelCause 函数返回一个 CancelCauseFunc,它接受错误并将其记录为取消原因。Cause(ctx) 或 ctx.Err() 读取取消错误信息
调用 CancelFunc 会取消子context及其子context,删除父context对子context的引用,并停止任何关联的计时器。未能调用 CancelFunc 会泄漏子context及其子context,直到父context被取消或计时器触发。
不要传递 nil 上下文,即使函数允许。如果您不确定要使用哪个上下文,请传递 context.TODO
变量
|
|
函数
- func WithCancel(parent Context) (ctx Context, cancel CancelFunc):返回子context和取消函数 CancelFunc
- func WithCancelCause(parent Context) (ctx Context, cancel CancelCauseFunc):返回子context和取消函数 CancelFunc
- func WithDeadline(parent Context, d time.Time) (Context, CancelFunc):给子context添加超时取消(时刻)
- func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc):给子context添加超时取消(时间段)
- func WithValue(parent Context, key, val any) Context:在父context的基础上,返回注册键值对的子context
- func Background() Context:返回一个永远不会被取消的非零值上下文
- func TODO() Context:TODO 返回一个非零的空上下文,看源码跟Background没啥区别,就是两个不同的全局变量
type CancelFunc func()
取消函数,是幂等的,可以被多个goroutine同时调用,调用已经取消掉context不会做任何事
type Context interface
方法
- Deadline() (deadline time.Time, ok bool):获取超时取消时刻
- Done() <-chan struct{}:判断是否取消,通常用select来读取
- Err() error:取消信息
- Value(key any) any:获取ctx注册的key对应的值