Go 的 http 包默认不提供静态文件服务,需手动注册 http.FileServer 并配合 http.StripPrefix 将 /public/ 路径映射到本地 public 目录,才能使 HTML 中的 和 正确加载 CSS 与图片资源。
go 的 `http` 包默认不提供静态文件服务,需手动注册 `http.fileserver` 并配合 `http.stripprefix` 将 `/public/` 路径映射到本地 `public` 目录,才能使 html 中的 `` 和 `` 正确加载 css 与图片资源。
在你的当前结构中,模板(/view/index.html)能正常渲染,但 和 无法加载,根本原因在于:Go 的 HTTP 服务器不会自动响应对 /public/xxx 的请求——它只处理你显式注册的路由(如 /),其余路径均返回 404。
✅ 正确做法是:为 /public/ 路径显式注册一个静态文件处理器。将以下代码添加到 main 包的服务器启动逻辑中(例如 main.go 的 main() 函数内,在 http.ListenAndServe 之前):
// 提供 /public/ 下的所有静态资源(CSS、JS、图片等)
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./public"))))⚠️ 注意事项:
- http.Dir("./public") 中的路径是相对于当前工作目录(os.Getwd()) 的,建议使用 ./public(而非 public 或绝对路径),确保跨环境一致性;
- http.StripPrefix("/public/", ...) 的作用是移除请求 URL 中的 /public/ 前缀,使 http.FileServer 能在 ./public 目录下准确查找 css/style.css(而非错误地查找 ./public/public/css/style.css);
- 该 handler 必须在 http.HandleFunc("/", ...) 之前注册(虽非严格必需,但按惯例优先注册静态路由更清晰);
- HTML 中引用路径应改为根路径(以 / 开头),即:
<link rel="stylesheet" href="/public/css/style.css"> <img src="/public/images/img_landing_page_mac.png" alt="Landing">
✅ 这样浏览器会向 /public/css/style.css 发起请求,被上述 http.Handle("/public/", ...) 拦截并响应真实文件;
❌ 避免使用相对路径如 ../public/...,因其依赖当前 HTML 所在路径(而 Go 模板无“当前目录”概念),极易出错。
? 补充建议:
立即学习“前端免费学习笔记(深入)”;
- 可封装静态服务逻辑,便于复用和配置:
func setupStaticFiles() { fs := http.FileServer(http.Dir("./public")) http.Handle("/public/", http.StripPrefix("/public/", fs)) } - 若未来需支持缓存、Gzip 或更复杂规则,可考虑使用 http.HandlerFunc 包装或引入第三方库(如 gin-contrib/static),但原生 http.FileServer 已完全满足基础需求。
至此,重启服务后,所有 /public/ 下的资源即可被正确加载,HTML 渲染与样式、图片显示将完全正常。


















