我想在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")
})
在http.HandleFunc中设置上下文变量的最佳方法是什么?
答案 0 :(得分:2)
问题中的代码会覆盖请求对象。这可能导致使用错误的上下文值编写堆栈代码。 Request.WithContext创建请求的浅表副本以避免这种情况。返回指向该浅拷贝的指针。
func setValue(r *http.Request, val string) *http.Requesst {
return r.WithContext(context.WithValue(r.Context(), myContext, val))
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r = setValue(r, "foobar")
})
如果then handler调用其他处理程序,则将新请求传递给新处理程序:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r = setValue(r, "foobar")
someOtherHandler.ServeHTTP(w, r)
})