面试题答案
一键面试- 关键步骤说明:
- 在Go语言的HTTP处理函数中,
Context
是通过http.Request
的Context
方法获取的。 - 当客户端取消请求时,
Context
会被取消,我们可以通过监听Context
的取消信号来及时感知。 - 对于需要清理的资源,比如数据库连接、文件句柄等,在感知到
Context
取消后进行相应的清理操作。
- 在Go语言的HTTP处理函数中,
- 具体实现代码:
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 获取请求的Context
ctx := r.Context()
// 模拟一个需要处理一段时间的任务
task := func(ctx context.Context) error {
select {
case <-time.After(5 * time.Second):
// 模拟任务完成
return nil
case <-ctx.Done():
// 如果Context被取消,这里会收到信号
return ctx.Err()
}
}
err := task(ctx)
if err != nil {
if err == context.Canceled {
// 清理资源,例如关闭数据库连接等
fmt.Println("Client canceled the request, cleaning up resources...")
// 这里可以添加实际的资源清理代码
}
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
fmt.Fprintf(w, "Task completed successfully")
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
在上述代码中:
handler
函数获取请求的Context
。task
函数模拟一个需要5秒完成的任务,同时监听Context
的取消信号。- 如果
Context
被取消(即客户端取消请求),ctx.Done()
会收到信号,此时会进行资源清理并返回相应的错误。 - 如果任务正常完成,则返回成功信息。