面试题答案
一键面试常见使用场景
- 控制子 goroutine 的生命周期:例如在一个 HTTP 处理函数中启动多个 goroutine 进行数据查询等操作,当 HTTP 请求结束时,通过 context 可以通知这些子 goroutine 结束,避免资源泄露。
- 传递截止时间:在执行一些有时间限制的任务时,将截止时间通过 context 传递给子 goroutine,当超过截止时间时,子 goroutine 可以优雅退出。
- 传递请求范围的数据:如在一个 HTTP 请求处理的多个函数调用链中传递用户认证信息等,避免在每个函数参数中都显示传递。
优化策略
- 复用 context:
- 原理:如果在一个调用链中有多个函数需要相同的 context 信息,避免每次都创建新的 context,而是复用已有的 context。这样可以减少内存分配和创建开销。例如在一个 HTTP 中间件链中,顶层创建的 context 可以一直传递下去,不需要每层中间件都创建新的 context。
- 避免不必要的 context 嵌套:
- 原理:过多的 context 嵌套会增加复杂性和资源开销。如果某些操作并不需要特定的 context 功能(如取消或截止时间),可以直接使用父级 context,而不是创建新的嵌套 context。这样可以减少内存占用和管理成本,使代码逻辑更清晰。