ctx

为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。

开局一张图:

Context

包含四个方法:

Done()Err()Deadline()Value()
emptyCtxcancelCtxtimerCtxvalueCtx
emptyCtx
Background()TODO()

另外三个也分别暴露了对应的方法:

遵循规则

在使用 Context 时,要遵循以下四点规则:

ctxnilcontext.TODO()

WithCancel

WithCancelDonecancelDonectxDone
cancel

举个例子:

gen

输出:

1
2
3
4
5

WithDeadline

WithDeadlineddWithDeadline(parent, d)parent
DoneDone

取消此上下文会释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用取消。

举个例子:

这段代码传递具有截止时间的上下文,来告诉阻塞函数,它应该在到达截止时间时立刻退出。

输出:

context deadline exceeded

WithTimeout

WithTimeoutWithDeadline(parent, time.Now().Add(timeout))

取消此上下文会释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用取消。

举个例子:

这段代码传递带有超时的上下文,以告诉阻塞函数应在超时后退出。

输出:

context deadline exceeded

WithValue

WithValuekeyval
WithValue
interface{}struct{}

举个例子:

这段代码演示了如何将值传递到上下文以及如何检索它(如果存在)。

输出:

found value: Go
key not found: color

本文的大部分内容,包括代码示例都是翻译自官方文档,代码都是经过验证可以执行的。如果有不是特别清晰的地方,可以直接去读官方文档。