如何在 http.HandleFunc 中设置上下文值?

mat*_*tes 0 go

我想在 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 中设置上下文变量的最佳方法是什么?

Cer*_*món 5

问题中的代码覆盖了请求对象。这可能会导致代码使用错误的上下文值向上堆栈。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)