Contents

go标准库-Context

go语言中文网

godoc

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

变量

1
2
3
4
var (
	background = new(emptyCtx)
	todo       = new(emptyCtx)
)

函数

  • 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对应的值
 |