Fiber路由路径必须以/开头,如/app.Get("/users", h);StrictRouting默认开启,/users与/users/视为不同路由;app.Group("/api")注册的路由需写完整路径,如api.Get("/users", h)对应/api/users;c.Params、c.QueryParam、c.BodyParser数据源完全隔离。

app.Get、app.Post这些函数注册的路径必须带前导斜杠
不写/就等于注册了个空路径或非法路径,比如app.Get("users", h)实际匹配的是GET users(无协议无主机的裸路径),浏览器发请求时根本不会命中。Fiber 路由引擎只认以/开头的完整路径。
正确写法一律加斜杠:app.Get("/users", h)、app.Post("/login", h)、app.Put("/items/:id", h)。别依赖框架“自动补”,它不会补。
- 路径中占位符用
:id、:slug等,不要写成{id}或$id - 可选参数用
:id?,但注意它只影响匹配,不改变c.Params("id")的读取逻辑——没传就是空字符串 - 通配段用
*,如app.Get("/static/*", h),此时c.Params("*")拿到的是截断后的子路径
StrictRouting=true是默认行为,/users和/users/不是同一个路由
Fiber 默认开启StrictRouting: true,这意味着末尾斜杠是路径语义的一部分。注册了app.Get("/users", h),就只响应GET /users;访问/users/会直接 404,哪怕你只差一个字符。
别关掉StrictRouting来“修 404”——关掉后/users/123可能被/users错误捕获,导致c.Params("id")取不到值,逻辑彻底错乱。
- 推荐做法:统一约定前端、OpenAPI、测试工具全部用无尾斜杠路径,后端也只注册一种形式
- 若需兼容,加中间件重定向:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 根路径
/本身允许有斜杠,c.Path()返回"/"是合法的,不用处理
app.Use和app.Group不能混用路径前缀
app.Use("/api", middleware)是前缀拦截,匹配/api、/api/users、/api/v1/health,但不匹配/apixxx或/api123(后面不是/或路径结束)。
app.Group("/api")则返回一个新路由实例,后续所有注册都必须显式写出完整路径:api.Get("/users", h) → 实际注册GET /api/users;若写成api.Get("/api/users", h),最终变成/api/api/users,多了一层。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
app.Use()对所有 HTTP 方法生效(GET/POST/PUT/DELETE 全覆盖) -
app.Group()只是组织路由,不改写路径逻辑,也不自动拼接 - 嵌套
Group(如app.Group("/v1").Group("/admin"))会让路径构造隐晦难调试,建议合并为app.Group("/v1/admin")
ctx.Params、ctx.QueryParam、ctx.BodyParser三者来源完全隔离
这三个方法读的数据源头不同,名字一样也不互通。混用必然拿不到值,且无报错提示,容易卡在调试阶段。
c.Params("id")只从路径占位符提取,例如app.Get("/user/:id", h)匹配/user/123后才可取到"123";对/user?id=123或 JSON body 无效。
c.QueryParam("q")只解析 URL query string,如/search?q=go&lang=en → c.QueryParam("q") == "go";不碰路径、header、body。
c.BodyParser(&v)专为 JSON 设计,要求Content-Type: application/json;若表单提交是application/x-www-form-urlencoded,得用c.FormValue("name")。
- URL 是
/user/123?format=json,那么c.Params("id") == "123",c.QueryParam("format") == "json",两者互不干扰 - 路径参数永远是字符串,
c.Params("id")不会自动转int,要用strconv.Atoi并检查错误 - 没注册对应占位符的路径(如
app.Get("/user", h)却调c.Params("id")),返回空字符串,不 panic
路径末尾斜杠、参数来源隔离、分组路径拼写——这三点在本地开发时往往看不出问题,一上联调环境或压测就暴露,而且错误现象分散(404 / 空参数 / 多余前缀),排查成本远高于写的时候多敲几个字符。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










