在 Go 语言中,context
包是用来传递截止日期、取消信号以及其他请求范围的值。这个包是在 Go 1.7 中正式引入的,它对于管理生命周期特别重要,尤其是在处理并发操作和服务之间的交互时。context.Context
是一个接口,它定义了四个方法:
Deadline()
- 返回context
是否有截止时间以及什么时候是截止时间。Done()
- 返回一个Channel
,这个Channel
会在context
被取消或超时时关闭。Err()
- 返回context
被取消时的错误。Value(key interface{}) interface{}
- 从context
中获取键对应的值。
以下是 context
的一些常见用法:
创建 Context
context
包提供了几个函数来创建和修改 Context
对象:
context.Background()
是所有Context
的根,通常只用于初始化和测试。context.TODO()
用于不确定应该使用哪个Context
或者当前函数还没有扩展到支持Context
的时候。context.WithCancel(parent Context)
返回一个带有新的Done
通道的Context
,该通道会在cancel
函数被调用时关闭。context.WithDeadline(parent Context, deadline time.Time)
和context.WithTimeout(parent Context, timeout time.Duration)
允许你设置超时时间或截止日期,当超时或截止日期到达时,Context
会自动取消。
使用 Context
在并发操作中使用 context
的基本模式是将 Context
对象作为第一个参数传递给你的函数。这允许函数了解它的执行环境以及何时应该停止工作。
func doSomething(ctx context.Context, data string) error {
// 检查context是否已经被取消
select {
case <-ctx.Done():
return ctx.Err()
default:
// 如果没有被取消,继续正常操作
}
// 实际的工作代码
}
在你的应用程序中,当你调用一个支持 Context
的函数时,你可以传递一个 Context
对象给它。如果这个函数调用了其他支持 Context
的函数,它也应该传递相同的 Context
。
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel(