Context 面试题

1. Go 语言里的 Context 是什么?

在 Go 中,Context 是一个用于在 协程之间传递上下文信息 的接口,定义在 context 官方文档 中。

它主要用于:

  • 控制 goroutine 生命周期
  • 超时控制
  • 取消任务
  • 传递请求级别的数据

其核心接口:

1
2
3
4
5
6
type Context interface {
Deadline() (deadline time.Time, ok bool) // 返回一个时间点,告知任务何时该被取消
Done() <-chan struct{} // 返回一个只读 channel,当 Context 被取消时会关闭这个 channel
Err() error // 在 Done 的 channel 关闭后,返回取消的原因
Value(key any) any // 返回指定 key 对应的 value,这是 context 携带的值
}

面试里可以这样总结:

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。

Context.Value 查找过程

4. Context 如何被取消?

Context 取消是通过 channel 关闭信号来实现的,主要有三种取消方式:

  1. 主动取消:通过 context.Withcancel 创建的 Context 会返回一个 cancel 函数,调用这个函数就会关闭内部的 done channel,所有监听这个 Context 的 goroutine 都能通过 ctx.Done() 收到取消信号。

  2. 超时取消context.WithTimeoutcontext.WithDeadline 会启动一个定时器,到达指定时间后自动调用 cancel 函数触发取消。

  3. 级联取消:当父 Context 被取消时,所有子 Context 会自动被取消,这是通过 Context 树的结构实现的。


参考资料: