新闻中心
如何在Golang中实现静态文件缓存_Golang 静态文件缓存示例
答案:在Golang中实现静态文件缓存需结合net/http包与HTTP缓存头。1. 使用http.FileServer提供静态文件,并通过中间件为CSS、JS、图片等资源设置Cache-Control: max-age=604800,实现7天浏览器缓存;2. 利用Go默认的Last-Modified支持,基于文件修改时间处理If-Modified-Since请求,返回304状态减少传输;3. 手动实现ETag,通过文件ModTime和Size生成标识,校验If-None-Match,匹配时返回304;4. 生产环境可选用go.rice或packr将静态文件嵌入二进制,或结合Nginx、CDN提升性能。核心是合理配置缓存头以降低重复请求,提升服务效率。

在 Golang 中实现静态文件缓存,关键在于利用 net/http 包提供的功能,并结合 HTTP 缓存头(如 Cache-Control、ETag 和 Last-Modified)来减少重复传输,提升服务性能。下面介绍几种常见且实用的方法。
使用 http.FileServer 提供静态文件并设置缓存头
最简单的方式是通过 http.FileServer 提供静态资源,并在中间件中添加缓存响应头。
示例代码:package main
import (
"net/http"
"strings"
)
func cacheControlMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 对静态资源设置缓存策略
if strings.HasSuffix(r.URL.Path, ".css") ||
strings.HasSuffix(r.URL.Path, ".js") ||
strings.HasSuffix(r.URL.Path, ".png") ||
strings.HasSuffix(r.URL.Path, ".jpg") ||
strings.HasSuffix(r.URL.Path, ".ico") {
w.Header().Set("Cache-Control", "public, max-age=604800") // 缓存 7 天
}
next.ServeHTTP(w, r)
})
}
func main() {
fs := http.FileServer(http.Dir("./static/"))
handler := cacheControlMiddleware(fs)
http.Handle("/static/", http.StripPrefix("/static/", handler))
http.ListenAndServe(":8080", nil)
}
上面的代码中,我们定义了一个中间件 cacheControlMiddleware,对常见的静态文件类型设置 Cache-Control: public, max-age=604800,浏览器将缓存这些资源 7 天,避免重复请求。
启用 ETag 和 Last-Modified 自动校验
Golang 的 http.ServeFile 和 http.FileServer 默认会根据文件修改时间自动生成 Last-Modified 头。如果客户端发送 If-Modified-Since 请求头,服务器会返回 304 Not Modified,节省带宽。
同时,Go 还支持生成基于文件内容哈希的 ETag,但默认不开启。你可以手动实现或使用第三方库增强此功能。
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
手动添加 ETag 示例:
func serveWithETag(w http.ResponseWriter, r *http.Request, filepath string) {
// 计算文件 ETag(简化版:用 ModTime 和 Size 拼接)
info, err := os.Stat(filep
ath)
if err != nil {
http.NotFound(w, r)
return
}
etag := fmt.Sprintf("%x-%x", info.ModTime().Unix(), info.Size())
w.Header().Set("ETag", etag)
// 检查 If-None-Match
if match := r.Header.Get("If-None-Match"); match != "" {
if match == etag {
w.WriteHeader(http.StatusNotModified)
return
}
}
// 设置缓存控制
w.Header().Set("Cache-Control", "public, max-age=31536000")
http.ServeFile(w, r, filepath)
}
这样,当客户端携带 If-None-Match 且 ETag 匹配时,服务端返回 304,不传输文件内容。
使用第三方工具优化静态服务
对于生产环境,可以考虑使用更高效的方案,比如:
- go.rice:将静态文件打包进二进制,便于部署。
- packr:类似 go.rice,嵌入资源。
- fasthttp + 静态路由:更高性能的替代 net/http。
同时,建议在前端加一层 Nginx 或 CDN,处理静态文件缓存,减轻 Go 服务压力。
基本上就这些。Golang 原生支持静态文件服务和基础缓存机制,配合合理的响应头设置,即可实现高效静态资源管理。关键是理解 Cache-Control、ETag 和 Last-Modified 的作用,并在合适场景下启用。不复杂但容易忽略细节。
以上就是如何在Golang中实现静态文件缓存_Golang 静态文件缓存示例的详细内容,更多请关注其它相关文章!
# 客户端
# 玉溪营销推广平台有哪些
# 淄博网络营销推广运营
# 萍乡网站关键词推广
# 抚顺seo营销招商加盟
# 东莞网站推广乐云seo
# 乌镇网站建设方案
# cnzz统计工具seo
# 刷粉网站推广全网最便宜
# 泰州seo优化实战
# 刷粉网站推广
# 更高
# 中文网
# 相关文章
# 你可以
# 加载
# css
# 并从
# 第三方
# 并在
# 如何在
# cdn
# 路由
# unix
# ai
# 工具
# 浏览器
# golang
# nginx
# go
# 前端
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
火锅吃太多会怎样 火锅吃太多会上火吗
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
照顾宝贝2小游戏免费秒玩入口
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
谷歌推RCS信息存档功能:公司可监控员工私密信息!
微博网页版直接访问 微博网页版账号管理快速入口
抖音创作助手登录入口_抖音创作辅助工具官网直达
mc.js游戏直达 mc.js网页免下载版本秒进地址
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
千牛数据看板网页版_千牛数据看板网页版访问方法
抖音网页版快捷访问 抖音网页版网页版入口操作教程
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
Shopware订单对象中获取产品自定义字段的正确方法
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
ACG动漫视频网入口 ACG动漫*免费正版观看地址
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
百度网盘网页版入口 百度网盘网页版官方登录网址
抖音极速版最新版本 抖音极速版官方下载地址
期待已久:小米17 Ultra、小米首款NAS本月登场
Go语言中动态执行代码字符串的策略与实践
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
必由学官方平台入口 必由学在线课堂登录地址
PDF文件体积过大处理_PDF压缩技巧详解
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
C#中解析不规范的HTML为XML 常见的坑与解决办法
Lar*el DB::listen 事件中的查询执行时间单位解析
C++如何生成随机数_C++ random库使用方法与范围设置
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
顺丰快件物流信息 官方网站查询入口
css绝对定位元素脱离父容器怎么办_确保父元素position非static
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
实现分段式页面滚动导航:CSS与J*aScript教程
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
J*a递归快速排序中静态变量的状态管理与陷阱
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法


2025-11-19
浏览次数:次
返回列表
ath)
if err != nil {
http.NotFound(w, r)
return
}
etag := fmt.Sprintf("%x-%x", info.ModTime().Unix(), info.Size())
w.Header().Set("ETag", etag)
// 检查 If-None-Match
if match := r.Header.Get("If-None-Match"); match != "" {
if match == etag {
w.WriteHeader(http.StatusNotModified)
return
}
}
// 设置缓存控制
w.Header().Set("Cache-Control", "public, max-age=31536000")
http.ServeFile(w, r, filepath)
}