是否有任何选择可以在http.HandlerFunc之外获取当前请求对象(结构)?我面临的问题是,每个请求仅需要唯一的随机哈希,我不能使用全局变量,因为如果我的应用程序将同时处理2个或更多请求,则每个请求都将覆盖全局变量值。
我发现可以使用这样的上下文:
func Init() Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
ctx := context.WithValue(request.Context(), "requestId", GetRequestHash())
next.ServeHTTP(writer, request.WithContext(ctx))
})
}
}
然后在HandlerFunc中,我可以获得这个唯一的哈希
request.Context().Value("requestId")
但是问题是我在应用程序中非常需要这个值,而不能仅仅通过参数传递此哈希值。我已经编写了许多处理程序,并且该处理程序调用了调用另一个函数的函数...我需要在HandlerFunc外部的某个地方添加
http.GetCurrentRequest
之类的内容,以获取请求上下文并最终获取requestId(每个请求的唯一哈希)。显然,我不能仅仅将这个哈希值另存为全局变量,因为它将被其他请求覆盖...
最佳答案
我认为您正在寻找的Got不支持的threadlocal equivalent。有些软件包可以完成线程本地存储,但是我不想推荐它们,因为Go团队建议使用上下文(请参见下面的链接)。
一些替代(不一定好)的选择
首选选项-使用
context
包在go developer blog中,
context
包是专门为这种情况而设计的。它允许开发人员传递值(如线程中提到的哈希值),以及在请求对于特定用例而言过长时取消上下文(从而取消底层goroutine)的能力。
关于go - Golang在处理程序功能之外获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61103731/