You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go模板执行完成后调用time.Sleep实现延迟逻辑

问题根因
  • Go语言中return语句会直接终止当前函数的执行,写在return后的代码永远不会被触发,所以会出现unreachable code报错。如果将休眠逻辑放在return之前,函数会先执行休眠再返回响应,自然会出现浏览器等待1分钟才加载模板的问题。
  • 你需要的是先返回HTTP响应给用户,再异步执行延迟任务,可以通过goroutine实现,不会阻塞当前请求的返回流程。
修复后的代码
func Main(w http.ResponseWriter, r *http.Request) error {
    match := Get("id1")
    if match {
        // 先执行模板渲染,返回响应给客户端
        execErr := MainTmpl.Execute(w, nil)
        // 启动独立goroutine运行异步延迟逻辑
        go func() {
            time.Sleep(1 * time.Minute)
            fmt.Println("Time Passed")
            // 如果这里有业务逻辑,记得添加recover捕获panic,避免拖垮整个服务
        }()
        // 返回模板执行错误给上层中间件处理
        return execErr
    } else {
        return LoginTmpl.Execute(w, nil)
    }
}
注意事项
  • 异步goroutine内的panic不会被HTTP服务的常规中间件捕获,必须在goroutine内部添加recover逻辑处理异常
  • 如果延迟逻辑需要用到请求的上下文数据,不要直接传递原请求的r.Context(),请求返回后该上下文会被自动取消,需要提前复制需要的参数值在goroutine内使用

内容的提问来源于stack exchange,提问作者user16942503

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:06:00