应使用 net/http + http.ServeMux 搭建可联调 Mock Server,而非 httptest.Server;后者专为单元测试设计,不支持固定端口、跨域访问及外部工具调用。

直接用 net/http + http.ServeMux 就够了,不需要引入任何第三方模块,Go 1.16+ 原生支持 embed 还能直接托管静态文件。
为什么不用 httptest.Server 部署本地模拟服务器
httptest.Server 是为单元测试设计的:它在 test 函数生命周期内运行,端口随机、不对外网暴露、无法被 Postman 或浏览器访问。你启动后 curl 一下就失败,不是代码问题,是它根本没打算让你“部署”。
- 它的地址只在
server.URL里,且仅限当前 test goroutine 可达 - 没有 CORS 头,默认拒绝前端跨域请求
- 不能监听固定端口(比如
:8080),前端代理配置会失效
用 net/http 搭最简可联调 Mock Server 的关键四步
核心不是写得多,而是每一步都避开真实联调中卡住人的点。
- 用
http.ServeMux而非http.HandleFunc匿名函数——方便后续加中间件(如日志、CORS) - 响应头必须显式设:
w.Header().Set("Content-Type", "application/json; charset=utf-8"),否则 fetch 解析 JSON 失败 - 加 CORS 头:
w.Header().Set("Access-Control-Allow-Origin", "*"),不然浏览器连预检请求都过不去 - 端口别硬写
:8080,先检查是否被占用:lsof -i :8080(macOS/Linux)或netstat -ano | findstr :8080(Windows)
用 //go:embed 托管前端静态资源(Go 1.16+)
很多 Mock Server 要配 Nginx 或 Webpack proxy,其实 Go 自己就能 serve HTML/JS/CSS——前提是别漏掉 embed 和 http.FileServer 的配合细节。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
立即学习“go语言免费学习笔记(深入)”;
- 把前端构建产物(如
dist/)放在项目根目录下,用//go:embed dist/*声明 - 用
http.FileServer(http.FS(assets)),但必须http.StripPrefix("/static", ...),否则路径多一层/static/dist/index.html - 别忘了给
index.html单独路由:mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "dist/index.html") })
启动时打印可用地址并阻塞,避免程序秒退
常见错误是 http.ListenAndServe(":8080", mux) 后没包 log.Fatal,结果进程静默退出,你以为跑起来了,其实什么都没监听。
- 用
srv := &http.Server{Addr: ":8080", Handler: mux}显式控制生命周期 - 启动用 goroutine:
go srv.ListenAndServe(),主 goroutine 留着打印和等待信号 - 加一行
fmt.Printf("Mock server running on http://localhost:8080\n"),比盲猜靠谱 - 若需优雅关闭(比如 Ctrl+C),加
signal.Notify+srv.Shutdown,但联调阶段非必需
真正卡住人的从来不是“怎么写”,而是 CORS 没开、Content-Type 写错、端口被占、或者压根没意识到 httptest.Server 不是拿来部署的。把这四点盯死,5 分钟内就能跑通一个前端可直连的 Mock 接口。

















