面试题答案
一键面试使用Context辅助函数注意事项
- 作用域问题:确保
Context
的作用域与实际需求匹配。例如,WithTimeout
创建的Context
应该在整个需要控制超时的函数链执行过程中有效。如果作用域过小,可能导致在函数链未完成时Context
就过期,而作用域过大则可能造成资源浪费或未能及时释放资源。 - 资源管理:在使用
WithCancel
创建可取消的Context
时,要确保在不需要时及时调用取消函数。如果忘记调用取消函数,可能导致相关资源(如 goroutine)无法及时释放,造成资源泄漏。 - 嵌套调用中的传递:在多层嵌套调用中,必须保证
Context
正确无误地传递到每一层函数。任何一层函数遗漏传递Context
,都可能导致后续函数无法响应取消信号或超时控制。
正确处理取消信号传递
- 顶层创建:在调用多层嵌套函数的顶层函数中,创建合适的
Context
,如使用WithTimeout
或WithCancel
。例如:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
err := topLevelFunction(ctx)
- 逐层传递:每一层函数都需要将
Context
作为参数传递给下一层函数。例如:
func middleLevelFunction(ctx context.Context) error {
return lowerLevelFunction(ctx)
}
- 响应取消:每个函数内部都要检查
Context
的取消信号。例如,在执行耗时操作前检查:
func lowerLevelFunction(ctx context.Context) error {
select {
case <-ctx.Done():
return ctx.Err()
default:
// 执行正常逻辑
}
// 执行具体任务
return nil
}
通过上述步骤,能够在多层嵌套调用的函数链中,正确使用 Context
辅助函数并处理好取消信号的传递。