【Go】演示如何在Go语言中使用context包

目录

演示如何在Go语言中使用context包


演示如何在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,比如传递认证信息、控制并发等等。

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/132103023