我想在 http.HandleFunc 中设置一个上下文值。以下方法似乎有效。
不过我有点担心*r = *r.WithContext(ctx)。
type contextKey string
var myContext = contextKey("myContext")
func setValue(r *http.Request, val string) {
ctx := context.WithValue(r.Context(), myContext, val)
*r = *r.WithContext(ctx)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
setValue(r, "foobar")
})
Run Code Online (Sandbox Code Playgroud)
在 http.HandleFunc 中设置上下文变量的最佳方法是什么?
问题中的代码覆盖了请求对象。这可能会导致代码使用错误的上下文值向上堆栈。Request.WithContext创建请求的浅表副本以避免这种情况。返回一个指向该浅拷贝的指针。
func setValue(r *http.Request, val string) *http.Request {
return r.WithContext(context.WithValue(r.Context(), myContext, val))
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r = setValue(r, "foobar")
})
Run Code Online (Sandbox Code Playgroud)
如果处理程序调用其他处理程序,则将新请求传递给新处理程序:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r = setValue(r, "foobar")
someOtherHandler.ServeHTTP(w, r)
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |