Go使用Gorilla Mux循环注册路由时Cookie已设置但检测不到问题
问题根源
这是Go语言循环变量被闭包捕获的经典问题:for range 循环中的迭代变量 k、v 是全局复用的,每次迭代只会修改同一块内存地址的值。你直接在 HandleFunc 的匿名闭包里引用 v,等循环结束后所有路由的handler拿到的 v 都是最后一次迭代的变量值,导致模板渲染逻辑完全错乱,进而触发异常的跳转逻辑,出现Cookie设置成功但检测不到的假象。
解决方案
在循环内部把迭代变量赋值给当前迭代的局部变量,再放到闭包里使用即可,修改路由注册代码如下:
pages := make(map[string]string) pages["/"] = "index" pages["/cookie"] = "cookie" for k, v := range pages { // 新增局部变量赋值,避免捕获复用的循环变量 path := k tplName := v router.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { err := tmpl.ExecuteTemplate(w, tplName, "") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }) }
额外优化建议
你在 middlewareHeaders 中强制设置了 Content-Encoding: gzip,但你已经使用了 handlers.CompressHandler 自动处理压缩逻辑,手动写死这个响应头会导致未被压缩的响应被浏览器错误当作gzip格式解析,响应头里的Set-Cookie也会被忽略,建议删掉这行手动设置的代码,由压缩中间件自动处理即可。
内容的提问来源于stack exchange,提问作者pigfox
相关产品推荐
相关产品推荐

