app.group() 创建带前缀的路由分组,返回 fiber.router 实例,自动拼接路径前缀(如 /api/users),支持嵌套、中间件批量绑定及语义化业务划分,不自动处理包路径或控制器反射。

用 app.Group() 创建带前缀的路由分组
直接调用 app.Group() 是最常用也最安全的方式,它返回一个 fiber.Router 实例,后续所有挂载在其上的路由都会自动拼接前缀。比如 api := app.Group("/api"),再写 api.Get("/users", handler),最终匹配路径就是 /api/users。
注意:前缀拼接是“从外到内”严格叠加的,app.Group("/v1").Group("/admin") 得到的是 /v1/admin,不是 /admin/v1。别指望它像字符串拼接那样可逆或随意换序。
-
app.Group()本身不注册任何路由,只提供上下文;必须在其返回对象上调用Get/Post等才真正生效 - 前缀末尾是否带斜杠不影响匹配逻辑,但建议统一风格(如全用
/api而非/api/),避免和StrictRouting冲突 - 嵌套分组时,中间件不会自动继承——外层
Group的中间件只对它直接挂载的子Group或路由生效,不会穿透到孙子级
给分组批量绑定中间件,别在每个路由里重复写
把中间件作为第二个参数传给 app.Group(),就能让整个分组共享这套前置逻辑。例如 admin := app.Group("/admin", authMiddleware, loggerMiddleware),之后 admin.Get("/dashboard", ...) 和 admin.Post("/settings", ...) 都会先经过这两个中间件。
这比在每个路由里手动传参更清晰,也避免改个鉴权逻辑就要全局搜索替换。但要注意:中间件执行顺序严格按参数顺序,authMiddleware 一定在 loggerMiddleware 之前运行。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 中间件函数签名必须是
func(*fiber.Ctx) error,否则编译失败或 panic - 如果某个分组内某条路由需要额外加一层校验(比如删除接口要 IP 白名单),可以单独在该路由上调用时再追加:
admin.Delete("/user", ipWhitelist, handler) - 分组中间件只对显式挂载在它下面的路由起作用,不会影响
app.Get("/health")这类顶层路由
分组名要映射真实业务域,别用 group1 或 v1 单独命名
分组前缀不是版本号占位符,而是语义边界。写 app.Group("/api/v2") 看似合理,但一旦 v3 上线,你得改两处:前缀 + 所有内部路由的硬编码路径(比如 c.Redirect(301, "/api/v3/users"))。更好的做法是 apiV2 := app.Group("/api/v2"),然后所有路径都基于 apiV2 构建,外部引用也只认这个变量名。
更进一步,按功能划分比按版本更可持续。比如 publicAuth := app.Group("/auth")、adminAPI := app.Group("/admin/api"),这样权限策略、日志归类、OpenAPI 分组都能自然对齐。
- 避免用
Route::group("legacy")这类模糊词,没人知道 legacy 指哪年写的代码 - 前端懒加载路径(如
import("./pages/AdminDashboard"))应与后端分组前缀保持语义一致,否则调试时容易迷失 - Go 编译器不检查路由字符串拼接,所以
"api/" + "v2" + "/users"这种写法极易出错,一律用分组变量控制
别把分组当命名空间,Group 不自动处理包路径或控制器加载
Fiber 的 Group 只负责路径前缀和中间件调度,不涉及 Go 包导入、结构体查找或反射调用。它不像 Laravel 的 Route::controller() 那样能自动绑定方法名到 HTTP 动词,也不像 ThinkPHP 那样默认隔离命名空间。
这意味着:如果你在分组里写 api.Get("/users", userHandler),userHandler 必须是已声明的函数变量,Fiber 不会去扫描 controllers/user.go 里有没有叫 GetUsers 的方法。
- 分组不会改变
c.Params()或c.QueryParam()的行为,它们仍按原始请求 URL 解析 - 若用
app.Mount()挂载子应用,那才是真正的隔离——但Mount不是Group,别混用 - 调试时发现某条路由没进中间件?先确认它是不是挂在了正确的
Group实例上,而不是误写在app根实例上
/admin/api 和 /api/admin 同时存在时。










