Go面试题更新 2026-08-05

在 Go 语言中,context 的取消机制是怎样的?

技术原理Go

考察说明

考查对 Go 标准库 context 包中取消机制的理解,包括取消的触发方式、传播原理及使用注意事项。

回答思路

  1. 【回答框架 1】context 是 Go 标准库提供的用于传递取消信号、截止时间及请求级数据的接口,核心类型包括 Context、CancelFunc、WithCancel、WithTimeout 等。取消机制通过 channel 或类似信号在 context 树中传播。
  2. 【回答框架 2】创建可取消的 context:调用 context.WithCancel(parent) 返回子 context 和 cancel 函数;调用 cancel 会关闭内部 channel,触发所有基于该 context 的派生 context 的取消。WithTimeout 和 WithDeadline 是基于 WithCancel 封装,超时或到达截止时间自动调用 cancel。
  3. 【回答框架 3】取消信号传播是单向的,从父 context 传到子 context。当父 context 被取消时,所有通过 WithCancel、WithTimeout 等派生的子 context 都会收到取消通知;但子 context 被取消不会影响到父 context,除非父 context 也显式取消。
  4. 【回答框架 4】实际使用中,通常将 context 作为函数第一个参数传递,并在 goroutine 中监听 context.Done() 返回的 channel,当 channel 关闭时,表示 context 已取消,应停止当前操作并返回。通过 select 语句同时监听多个 channel 实现优雅退出。
  5. 【回答框架 5】需要注意 context 取消后,需要及时释放资源,避免内存泄漏;同时 context 不应被存储在结构体中,而应显式传递,且使用 WithTimeout 或 WithDeadline 时需调用 cancel 释放定时器资源,即使超时未触发也应在函数退出时调用 cancel。
  6. 【关键点 1】context 取消通过关闭内部 channel 传播,Done() 返回的 channel 关闭即表示取消。
  7. 【关键点 2】cancel 函数只能触发取消,不会中断正在执行的代码,需要协程主动检查并退出。
  8. 【关键点 3】取消信号由父向子传播,子取消不影响父。
  9. 【关键点 4】WithTimeout 和 WithDeadline 在超时或到达截止时间时自动调用 cancel。
  10. 【关键点 5】使用 context 后应调用 cancel 释放与定时器相关的资源,避免泄漏。
  11. 【易错点 1】容易误以为调用 cancel 会立即终止 goroutine,实际只是发出信号,需要代码配合响应。
  12. 【易错点 2】忘记调用 cancel 函数,特别是在 WithTimeout 场景下可能导致资源泄漏。
  13. 【易错点 3】将 context 错误地存入结构体或作为长期持有对象,而不是作为函数参数显式传递,导致取消信号传播混乱。