Context 面试题
Context 面试题
1. Go 语言里的 Context 是什么?
在 Go 中,Context 是一个用于在 协程之间传递上下文信息 的接口,定义在 context 官方文档 中。
它主要用于:
- 控制 goroutine 生命周期
- 超时控制
- 取消任务
- 传递请求级别的数据
其核心接口:
1 | type Context interface { |
面试里可以这样总结:
Context 本质上是一种协程间的“信号传递 + 范围控制”的工具,它的核心作用是在一个请求处理链路中优雅地传递取消信号、超时和截止日期,并能携带一些范围内的键值对数据
2. Go 语言的 Context 有什么作用?
主要用于超时控制、协程取消、链路级联取消以及请求级数据传递,广泛应用于 HTTP、RPC、数据库等场景。
3. Context.Value 的查找过程是怎样的?
Context.Value 的查找过程是一个链式递归查找的过程,从当前 Context 开始,沿着父 Context 链一直向上查找直到找到对应的 key 或者到达根 Context。
具体流程是:当调用 ctx.Value(key) 时,首先检查当前 Context 是否包含这个 key,如果当前层没有,就会调用 parent.Value(key) 继续向上查找。这个过程会一直递归下去,直到找到匹配的 key 返回对应的 value,或者查找到根 Context 返回 nil。

4. Context 如何被取消?
Context 取消是通过 channel 关闭信号来实现的,主要有三种取消方式:
-
主动取消:通过
context.Withcancel创建的 Context 会返回一个 cancel 函数,调用这个函数就会关闭内部的 done channel,所有监听这个 Context 的 goroutine 都能通过ctx.Done()收到取消信号。 -
超时取消:
context.WithTimeout和context.WithDeadline会启动一个定时器,到达指定时间后自动调用 cancel 函数触发取消。 -
级联取消:当父 Context 被取消时,所有子 Context 会自动被取消,这是通过 Context 树的结构实现的。
参考资料: