目录
演示如何在Go语言中使用context
包
package main
import (
"context"
"fmt"
"net/http"
"time"
)
func handler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
// 从Context中获取请求ID
requestID := ctx.Value("requestID").(string)
// 模拟处理耗时操作
time.Sleep(2 * time.Second)
fmt.Fprintf(w, "Request ID: %s\n", requestID)
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 创建一个带有取消信号的Context
ctx, cancel := context.WithCancel(r.Context())
defer cancel()
// 为Context添加请求ID
requestID := generateRequestID()
ctx = context.WithValue(ctx, "requestID", requestID)
// 设置截止时间为5秒后
ctx, _ = context.WithTimeout(ctx, 5*time.Second)
// 执行处理函数
handler(ctx, w, r)
})
http.ListenAndServe(":8080", nil)
}
func generateRequestID() string {
// 在实际应用中,可以根据需要生成唯一的请求ID
return "12345678"
}
在上面的示例中,我们定义了一个handler
函数作为HTTP请求处理程序。这个函数接收一个context.Context
参数,代表请求的上下文。
在main
函数中,我们使用http.HandleFunc()
函数将根路径的处理函数设置为匿名函数。在此匿名函数中,我们创建一个带有取消信号的context.Context
,然后使用context.WithValue()
函数添加请求ID,最后使用context.WithTimeout()
函数设置截止时间。
在处理函数中,我们从Context
中提取请求ID,并通过fmt.Fprintf()
函数将其写入响应体中。同时,我们模拟了一个耗时的操作,以便演示如何使用截止时间。
你可以在终端运行代码并在浏览器中访问http://localhost:8080/
来看到效果。注意,由于设置了2秒的睡眠时间,因此页面加载将会有一定延迟。
这只是一个简单的示例,用于展示如何在Go语言中使用context
包。你可以根据具体的需求和场景来使用context
,比如传递认证信息、控制并发等等。