我需要这样做吗:
r.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
muxctx.Set(r, "req-res-ctx", &mw.Ctx{
Log: vbl.Stdout.Child(&map[string]interface{}{}),
})
defer func() {
muxctx.Delete(r, "req-res-ctx") // <-------------------- HERE
}()
next.ServeHTTP(w, r)
})
})
或者上下文会神奇地自动删除该条目吗?我想我也需要这样做:
defer func() {
muxctx.Delete(r) // delete ref to request too?
}()
看起来我们应该像这样使用 muxctx.Clear(r) :
r.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
muxctx.Set(r, "req-res-ctx", &mw.Ctx{
Log: vbl.Stdout.Child(&map[string]interface{}{}),
})
defer func() {
muxctx.Delete(r, "req-res-ctx")
muxctx.Clear(r) // <---------------HERE
}()
next.ServeHTTP(w, r)
})
})
我还读到我们应该使用
ctx := r.Context()
,但这个 API 看起来很混乱,不确定这是否是一个改进。