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