group()是即时生效的语法糖,直接声明前缀并链式注册路由;注意路径末尾/不可省略,避免//错误;中间件可随group传入,父子组不共享;通配符须谨慎使用以防冲突;抽离路由应接收gin.routergroup而非gin.engine。

直接用 Group() 声明前缀,括号内写路由
不需要额外初始化或注册,Group() 是个即时生效的语法糖。调用它返回一个 *gin.RouterGroup,你立刻就能在其上链式注册 GET、POST 等方法。
常见错误是把路径末尾的 / 当成可选:写成 r.Group("/api") 和 r.Group("/api/") 效果不同——后者会让 GET("") 变成匹配 /api//xxx,多出一个空段,容易引发 404 或路由错位。
- 正确写法:
v1 := r.Group("/api/v1"),然后v1.GET("/users", handler)对应完整路径/api/v1/users - 避免嵌套过深:别写
r.Group("/a").Group("/b").Group("/c").GET(...),改用显式变量ab := r.Group("/a/b"); cGroup := ab.Group("/c"),方便调试和加中间件 - 空路径
""在 Group 内表示“该组根路径”,比如v1.GET("", home)对应/api/v1/(注意末尾斜杠)
Group() 的第二个参数直接传中间件
中间件不是必须单独调用 Use();可以在创建 Group 时一并传入,语义更紧凑,也避免漏加。
例如 admin := r.Group("/admin", AuthMiddleware(), LoggerMiddleware()),之后所有 admin.GET、admin.POST 都自动经过这两个中间件,顺序就是传入顺序:请求先进 AuthMiddleware,再进 LoggerMiddleware。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 全局中间件(如
recovery、logger)必须在gin.Default()或gin.New()后立即Use(),不能塞进某个 Group 里,否则对其他组无效 - 父子 Group 不共享中间件:父组
v1.Use(m1)不会作用于兄弟组v2,也不会“穿透”到子组之外的同级路由 - 若某组内部分路由需跳过某个中间件(比如登录接口不校验 token),得拆成两个 Group,或改用条件中间件
嵌套 Group 时路径拼接规则必须手算
Gin 不做路径自动归一化,Group 的路径是字符串拼接,不是 URL 解析。这意味着 r.Group("/v1").Group("user") 和 r.Group("/v1/").Group("/user") 生成的最终路径都是 /v1/user,但后者多了一个冗余 /,可能干扰某些代理或前端路由。
更危险的是通配符混用:一旦用了 :id 或 *filepath,就不能在同一层级下注册冲突的静态路径。比如 g := r.Group("/files"); g.GET("/:name", h1); g.GET("/download/:name", h2) 是合法的;但若写成 g := r.Group("/files/:type"); g.GET("/logo.png", h3),就会触发 panic:wildcard route conflicts with existing children。
- 通配符只能出现在 Group 前缀之后的首个路径段,且不能和同级静态路径共存
- 嵌套时建议统一风格:要么全带尾部
/(如/api/v1/),要么全不带,避免拼接出// - 调试时用
r.Routes()打印所有注册路由,确认实际路径是否符合预期
路由逻辑抽离到独立文件时,传 *gin.Engine 还是 *gin.RouterGroup
抽离函数时,接收 *gin.RouterGroup 更安全、更灵活。它意味着该函数只负责“往某个分组里加路由”,不侵入全局引擎,便于单元测试和复用。
比如定义 func RegisterUserRoutes(rg *gin.RouterGroup),调用方写 userAPI := r.Group("/api/v1/users"); RegisterUserRoutes(userAPI)。如果函数接收 *gin.Engine,就只能硬编码前缀,失去分组隔离性。
- 不要在抽离函数里调用
r.Use()或r.Static()—— 这些属于引擎层级操作,应由主入口统一管理 - 若需为抽离的路由统一加中间件,应在调用
RegisterXxxRoutes()前,对userAPI调用Use() - 多个模块的路由函数可按包组织,比如
routes/auth.go、routes/order.go,主文件只做组装,不写具体 handler










