如何在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
相关产品推荐
相关产品推荐

