Go语言如何用context设置超时_Go语言context超时控制教程【收藏】
context.WithTimeout 无效果是因为未将 ctx 传入下游函数或函数未监听 ctx.Done()超时后 ctx.Err() 返回 context.DeadlineExceeded应使用 errors.Is(err, context.DeadlineExceeded) 判断。Go 里用 context.WithTimeout 设置超时不是“加个 context 就自动超时”必须显式传给下游函数且该函数得真正检查 ctx.Done() —— 否则超时纯属摆设。为什么 context.WithTimeout 调用了却没效果常见错误是只创建了带超时的 ctx但没把它传进实际执行 IO 或计算的函数里。比如调用 http.Client.Do 时不传 ctx或自己写的数据库查询函数压根不接收 ctx 参数。关键点context 本身不中断任何 goroutine它只是提供一个信号通道ctx.Done()所有可能阻塞的操作必须主动监听 ctx.Done() 并退出标准库中如 http.Client、sql.DB.QueryContext 等才支持 context裸写 time.Sleep 或循环不检查 ctx就完全无视超时WithTimeout 和 WithDeadline 该怎么选两者本质一样WithTimeout 是基于当前时间 持续时间算出 deadlineWithDeadline 直接指定绝对时间点。选哪个取决于你控制超时的粒度。立即学习“go语言免费学习笔记深入”使用建议对外部 API 调用、用户请求处理用 WithTimeout 更自然比如“最多等 5 秒”需要和外部系统对齐截止时间如分布式任务协调用 WithDeadline 避免本地时钟漂移影响注意两个函数返回的 ctx 都要配合 defer cancel()否则可能泄漏 timer超时后 ctx.Err() 返回什么怎么判断超时触发后ctx.Err() 返回 context.DeadlineExceeded这是一个预定义的 error不是字符串匹配。 跃问 跃问是由阶跃星辰开发的免费AI智能问答助手随时帮你智能搜索、高效阅读、识图理解、和你畅聊感兴趣的话题。