Go标准库原生支持HTTP响应gzip压缩,需检测Accept-Encoding头、设置Content-Encoding和Vary头,跳过小响应、已压缩文件及204/304状态码,并避免压缩含Set-Cookie的响应。
Go 标准库原生支持 HTTP 响应的 gzip 压缩,无需第三方依赖。关键在于正确配置 http.ResponseWriter,并结合中间件统一处理,避免手动重复编码。
Go 1.8+ 提供了 gzip.NewWriter 和标准 http.ResponseWriter 的兼容封装。最直接的做法是:在 handler 中检测请求头 Accept-Encoding: gzip,若匹配则包装响应体为 gzip writer,并设置响应头 Content-Encoding: gzip 和 Vary: Accept-Encoding(告知缓存代理该响应依赖于请求头)。
Go 官方未内置 gzip 中间件,但社区广泛采用 github.com/gorilla/handlers.CompressHandler 或更轻量的 net/http/pprof 风格封装。不过从 Go 1.22 起,net/http 新增了 http.Handler 接口的增强能力,更推荐自己写一个简洁中间件:
r.Header.Get("Accept-Encoding") 是否包含 gzip
gzip.NewWriter(w),并返回自定义 responseWriter 类型,重写 Write、WriteHeader 和 Header()
WriteHeader 后或首次 Write 前设置 Content-Encoding 和 Vary 头gzWriter.Close() 确保数据刷出,且不能多次关闭压缩不是万能的,需注意边界情况:
以下是一个生产可用的轻量中间件(约 30 行),支持自动降级、长度阈值和安全头过滤:
func gzipMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
next.ServeHTTP(w, r)
return
}
w.Header().Set("Vary", "Accept-Encoding")
gz := gzip.NewWriter(w)
defer gz.Close()
w = &gzipResponseWriter{Writer: gz, ResponseWriter:
w}
next.ServeHTTP(w, r)
})
}
type gzipResponseWriter struct {
io.Writer
http.ResponseWriter
}
func (w *gzipResponseWriter) Write(b []byte) (int, error) {
if w.Header().Get("Content-Encoding") == "" {
w.Header().Set("Content-Encoding", "gzip")
}
return w.Writer.Write(b)
}
func (w *gzipResponseWriter) WriteHeader(statusCode int) {
if statusCode < 300 && statusCode != 204 && statusCode != 304 {
w.Header().Set("Content-Encoding", "gzip")
}
w.ResponseWriter.WriteHeader(statusCode)
}
使用时只需:http.ListenAndServe(":8080", gzipMiddleware(yourRouter))。
基本上就这些。核心是“检测 + 包装 + 设置头 + 正确关闭”,不复杂但容易忽略细节。
# git
# go
# github
# cookie
# golang
# 编码
# 字节
# ai
# pdf
# 状态码
# 标准库
# 中间件
# 封装
相关文章:
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
网站企业制作流程,用什么语言做企业网站比较好?
python的本地网站制作,如何创建本地站点?
建站上市公司网站建设方案与SEO优化服务定制指南
开源网站制作软件,开源网站什么意思?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何在IIS服务器上快速部署高效网站?
如何获取PHP WAP自助建站系统源码?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
家具网站制作软件,家具厂怎么跑业务?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何通过cPanel快速搭建网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
安徽网站建设与外贸建站服务专业定制方案
如何通过FTP服务器快速搭建网站?
广州美橙建站如何快速搭建多端合一网站?
如何选择高效响应式自助建站源码系统?
如何通过建站之星自助学习解决操作问题?
如何将凡科建站内容保存为本地文件?
建站之星如何修改网站生成路径?
如何在Windows 2008云服务器安全搭建网站?
建站上传速度慢?如何优化加速网站加载效率?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
用v-html解决Vue.js渲染中html标签不被解析的问题
香港服务器网站卡顿?如何解决网络延迟与负载问题?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何通过云梦建站系统实现SEO快速优化?
如何快速搭建高效WAP手机网站吸引移动用户?
建站之星如何开启自定义404页面避免用户流失?
Python路径拼接规范_跨平台处理说明【指导】
如何在万网开始建站?分步指南解析
宝塔Windows建站如何避免显示默认IIS页面?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何快速选择适合个人网站的云服务器配置?
专业网站建设制作报价,网页设计制作要考什么证?
如何制作网站标识牌,动态网站如何制作(教程)?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何高效搭建专业期货交易平台网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
定制建站是什么?如何实现个性化需求?
大型企业网站制作流程,做网站需要注册公司吗?
建站之星价格显示格式升级,你的预算足够吗?
建站之星如何优化SEO以实现高效排名?
实例解析angularjs的filter过滤器
如何在阿里云通过域名搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。