登录
首页 >  Golang >  Go问答

Golang 在处理函数之外获取请求

来源:stackoverflow

时间:2024-04-15 23:33:32 264浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Golang 在处理函数之外获取请求》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

是否有任何选项可以在 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")

但问题是我的应用程序非常非常深入地需要这个值,而且我不能只通过参数传递这个哈希值。我已经编写了许多处理程序,并且此处理程序调用调用另一个处理程序的函数...我需要像 http.getcurrentrequest 这样的东西在 handlerfunc 之外的某个地方来获取请求上下文并最终获取 requestid (每个请求的唯一哈希值)。

显然我不能只将此哈希值保存为全局变量,因为它会被其他请求覆盖...


解决方案


我认为您正在寻找 Go 不支持的 threadlocal equivalent。有一些包可以完成线程本地存储,但我不想推荐它们,因为 Go 团队推荐上下文(请参见下面的链接)。

一些替代(不一定是好的)选项

  • 将哈希存储在某些 Go 代码中(针对并发场景使用适当的锁)。
  • 使用数据存储(例如 Redis)来存储这些值。

首选选项 - 使用 context

go developer blog中,context包是专门为这种场景设计的。它允许开发人员传递值(如线程中提到的哈希),以及当请求对于特定用例来说太长时取消上下文(从而取消底层 goroutine)的能力。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>