首页 >后端开发 >Golang >如何有效地将上下文传递给 Golang 中的中间件和处理程序?

如何有效地将上下文传递给 Golang 中的中间件和处理程序?

Barbara Streisand
Barbara Streisand原创
2024-11-10 10:36:02317浏览

How to Effectively Pass Context to Middleware and Handlers in Golang?

将 Golang 请求中的上下文传递给中间件

理解 Golang 1.7 中引入的上下文机制可能具有挑战性。本文旨在阐明如何有效地将上下文传递给中间件和处理函数。

派生上下文

正如 Go 并发模式博客文章中提到的,您可以派生上下文从背景语境来看。 Request 对象还提供 Context 和 WithContext 方法。这允许您为特定目的创建自定义上下文。

实现超时

在请求处理程序中,您可以使用 WithTimeout 方法指定超时。这将创建一个具有设置超时的派生上下文。

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)

将用户信息添加到上下文

在授权检查器中,您可以在之前将用户信息添加到上下文调用 ServeHTTP。

type ContextKey string

const ContextUserKey ContextKey = "user"

// ...

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))

从上下文中检索用户信息

在处理程序中,您可以从上下文中访问用户信息。

user := r.Context().Value(ContextUserKey)
doSomethingForThisUser(user.(string))

使用上下文链接中间件

在主函数中,您可以使用 util.UseMiddleware 链接中间件处理程序,在每个处理程序之间传递上下文。

router.Handle("/hello", util.UseMiddleware(authCheck, HandlerW, ...))

结论

按照以下步骤,您可以有效地将 Golang 请求中的上下文传递给中间件和处理函数,从而增强灵活性并维护代码中的线程安全。

以上是如何有效地将上下文传递给 Golang 中的中间件和处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn