上线必须用 fiber.new(),禁用 fiber.default()——后者自动启用日志和恢复中间件,会泄露敏感头、拖慢ttfb 0.3–0.8ms;strictrouting需配合重定向中间件而非关闭;ctx.next()仅在未写响应时生效;路径参数与查询参数来源严格分离。

直接用 fiber.Default() 启动服务上线?别干这事。它自带日志、panic 恢复和请求 ID 中间件,会泄露 Authorization 头、拖慢 TTFB 0.3–0.8ms,高并发下 I/O 直接打满。
StrictRouting 导致 /users 和 /users/ 都 404?
Fiber 默认开启 StrictRouting: true,把结尾带斜杠和不带斜杠的路径视为完全不同的路由。你只注册了 app.Get("/users", ...),那访问 /users/ 就必然 404——这不是 bug,是设计行为。
- 别全局关掉:
fiber.New(&fiber.Config{StrictRouting: false})看似省事,但会导致/users/:id和/users冲突:请求/users/123可能被前者匹配,c.Params("id")拿不到值 - 推荐做法:显式注册两条路由,比如
app.Get("/users", handler)和app.Get("/users/", handler) - 或加一层重定向中间件,对所有以
/结尾的路径做 301 跳转(注意排除静态资源如/static/)
ctx.Params("id") 和 ctx.QueryParam("q") 总是取不到值?
这是混淆了路径参数和查询参数的来源位置。两者底层解析逻辑完全隔离,API 也不重叠。
-
c.Params("id")只读路由定义里的占位符,比如app.Get("/user/:id", ...)对应/user/123中的123 -
c.QueryParam("q")只读 URL query string,比如/user/123?q=abc中的abc,跟路径无关 - 如果 URL 是
/api/search?format=json&page=2,那c.QueryParam("format") == "json",c.QueryParam("page") == "2",c.Params()全为空 - 别用
c.FormValue()解析 JSON body——那是给application/x-www-form-urlencoded准备的;JSON 请用c.Body()+json.Unmarshal()或c.Struct(&v)
ctx.Next() 不执行后续中间件?检查是否已写响应
c.Next() 不是“继续往下走”,而是把控制权交还给 Fiber 调度器;它是否继续执行后续 handler,取决于当前 handler 是否已写入响应头或体。
- 典型错误:权限中间件里调了
c.Status(401).SendString("unauthorized"),接着又写c.Next()—— 此时响应已发出,Fiber 直接终止链路,后续 handler 完全不会进 - 正确做法:拒绝就直接
return c.Status(401).SendString(...);放行才调c.Next() - 调试技巧:每个中间件开头加
log.Printf("→ %s", "auth"),结尾加log.Printf("← %s", "auth"),一眼看出卡在哪一层
上线必须用 fiber.New(),别碰 fiber.Default()
fiber.Default() 是开发快捷入口,自动挂载 Logger、Recover、RequestID;fiber.New() 是空应用,什么都没有。
- 上线还用
Default(),等于每秒打几百条完整请求日志(含Authorization、Cookie等敏感字段),I/O 压垮 QPS - 实测在 4 核 8G 环境下,TTFB 增加 0.3–0.8ms,高并发下不可忽略
- 开发阶段用
Default()没问题;上线前必须切到fiber.New(),再按需手动加中间件(比如只记录 error 级别日志,或对接结构化日志系统) - 别自己拼
http.Client做反向代理——Body 只能读一次、Header 易遗漏、连接不复用、流式响应支持差;该用httputil.NewSingleHostReverseProxy的地方,就老实用它
最常被忽略的其实是路由树行为:Fiber 用自研基数树管理路径,:id 是参数节点,不阻断前缀共享,但同级同名参数会覆盖;* 通配只允许出现在末尾;大小写默认敏感。这些细节不看源码或 debug 日志,光靠试错很难定位 404 来源。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











