MST

星途 面试题库

面试题:Go语言中Context在HTTP服务中的中等应用

在一个简单的Go语言HTTP服务中,如何正确使用Context来控制请求的生命周期,比如在客户端取消请求时,服务端能够及时感知并清理相关资源,请给出具体实现代码及关键步骤说明。
35.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 关键步骤说明
    • 在Go语言的HTTP处理函数中,Context是通过http.RequestContext方法获取的。
    • 当客户端取消请求时,Context会被取消,我们可以通过监听Context的取消信号来及时感知。
    • 对于需要清理的资源,比如数据库连接、文件句柄等,在感知到Context取消后进行相应的清理操作。
  2. 具体实现代码
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()会收到信号,此时会进行资源清理并返回相应的错误。
  • 如果任务正常完成,则返回成功信息。