Home >Backend Development >Golang >How to Effectively Pass Context to Middleware and Handlers in Golang?
Passing Context in Golang Request to Middleware
Understanding the context mechanism introduced in Golang 1.7 can be challenging. This article aims to clarify how to effectively pass context to middleware and handler functions.
Deriving Contexts
As mentioned in the Go Concurrency Patterns blog post, you can derive contexts from the background context. The Request object also provides Context and WithContext methods. This allows you to create customized contexts for specific purposes.
Implementing Timeout
Within your request handler, you can specify a timeout using the WithTimeout method. This creates a derived context with a set timeout.
ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second)) defer cancel() r = r.WithContext(ctx)
Adding User Information to Context
In your authorization checker, you can add user information to the context before calling ServeHTTP.
type ContextKey string const ContextUserKey ContextKey = "user" // ... ctx := context.WithValue(r.Context(), ContextUserKey, "theuser") h.ServeHTTP(w, r.WithContext(ctx))
Retrieving User Information from Context
From within the handler, you can access the user information from the context.
user := r.Context().Value(ContextUserKey) doSomethingForThisUser(user.(string))
Chaining Middleware with Context
In your main function, you can chain middleware handlers using util.UseMiddleware, passing context across each handler.
router.Handle("/hello", util.UseMiddleware(authCheck, HandlerW, ...))
Conclusion
By following these steps, you can effectively pass context in Golang requests to middleware and handler functions, enhancing flexibility and maintaining thread safety within your code.
The above is the detailed content of How to Effectively Pass Context to Middleware and Handlers in Golang?. For more information, please follow other related articles on the PHP Chinese website!