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

时间:2018-04-13 22:07:34

标签: 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")
})

在http.HandleFunc中设置上下文变量的最佳方法是什么?

1 个答案:

答案 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)
})