go - Golang在处理程序功能之外获取请求

标签 go

是否有任何选择可以在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团队建议使用上下文(请参见下面的链接)。

一些替代(不一定好)的选择

  • 将散列存储在某些go代码中(针对并发方案使用适当的锁)。
  • 使用数据存储区(如Redis)来存储这些值。

  • 首选选项-使用context

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

    关于go - Golang在处理程序功能之外获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61103731/

    相关文章:

    go - gc Go 是如何处理堆分配的?

    go - Stringers 接口(interface)是否仅适用于 golang 中的值接收器

    go - 如何在gin路由中添加多个组实现api版本继承?

    go - 指针引用未存储在我的 go 程序中的结构中

    Go net/http 在高负载下内存泄漏

    string - 如何在 Golang 中使用 Append 方法。语法要求接口(interface)?

    go - golang中调试日志的使用方法

    Golang - 将 Exec 输出复制到日志

    go - 导入但未使用错误

    go - 在选择中的同一 channel 上读写