news 2026/6/21 19:44:31

Gin.RouterGroup:分组、中间件与路径组合

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Gin.RouterGroup:分组、中间件与路径组合

在 Gin 框架中,真正支撑路由能力的不是gin.Engine,而是gin.RouterGroup

gin.Engine本质上是嵌入了RouterGroup的增强结构(type Engine struct { *RouterGroup ... }),因此你调用r.GET()r.Group()时,实际上是在操作一个RouterGroup实例。

RouterGroup是 Gin 的核心抽象,它提供了:

  • 路径前缀管理(自动拼接)
  • 中间件作用域隔离
  • 嵌套分组能力
  • 统一的方法注册接口(GET/POST/Use/Static 等)

理解RouterGroup的工作方式,是掌握 Gin 架构设计的关键

HTTP 方法路由

// 所有 HTTP 方法GET(pathstring,handlers...HandlerFunc)IRoutesPOST(pathstring,handlers...HandlerFunc)IRoutesPUT(pathstring,handlers...HandlerFunc)IRoutesDELETE(pathstring,handlers...HandlerFunc)IRoutesPATCH(pathstring,handlers...HandlerFunc)IRoutesHEAD(pathstring,handlers...HandlerFunc)IRoutesOPTIONS(pathstring,handlers...HandlerFunc)IRoutesANY(pathstring,handlers...HandlerFunc)IRoutes// 自定义方法Handle(httpMethod,relativePathstring,handlers...HandlerFunc)IRoutes

中间件管理

// 添加中间件Use(middleware...HandlerFunc)IRoutes

分组创建

// 创建子分组Group(componentstring,handlers...HandlerFunc)*RouterGroup

静态文件服务

// 静态文件StaticFile(relativePath,filepathstring)IRoutesStatic(relativePath,rootstring)IRoutesStaticFS(relativePathstring,fs http.FileSystem)IRoutes

路径组合规则

// 基础路径组合规则r:=gin.Default()api:=r.Group("/api")// basePath: "/api"v1:=api.Group("/v1")// basePath: "/api/v1"users:=v1.Group("/users")// basePath: "/api/v1/users"// 最终路由:// users.GET("/profile") → 实际路径: /api/v1/users/profile// users.POST("/create") → 实际路径: /api/v1/users/create

基础用法

funcmain(){r:=gin.Default()// Engine 本身就是一个 RouterGroupr.GET("/",handler)// r 是 *RouterGroup// 创建分组api:=r.Group("/api")// 返回 *RouterGroupapi.GET("/users",handler)api.POST("/users",handler)}

分组嵌套

funcmain(){r:=gin.Default()// 一级分组api:=r.Group("/api"){api.GET("/users",handler1)api.POST("/users",handler2)// 二级分组v1:=api.Group("/v1"){v1.GET("/users",handler3)v1.POST("/users",handler4)}v2:=api.Group("/v2"){v2.GET("/users",handler5)}}}

中间件分组

funcmain(){r:=gin.Default()// 公共路由组(无中间件)public:=r.Group("/public"){public.GET("/info",handler1)}// 受保护路由组(带认证中间件)protected:=r.Group("/api")protected.Use(AuthMiddleware())// 该组所有路由都使用认证中间件{protected.GET("/profile",handler2)protected.POST("/posts",handler3)// 在分组内再创建子分组admin:=protected.Group("/admin")admin.Use(AdminMiddleware())// 管理员中间件{admin.GET("/dashboard",handler4)admin.DELETE("/users/:id",handler5)}}}

完整示例

packagemainimport("github.com/gin-gonic/gin""net/http")funcAuthMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){// 简单认证逻辑token:=c.GetHeader("Authorization")iftoken==""{c.JSON(401,gin.H{"error":"Unauthorized"})c.Abort()return}c.Next()}}funcAdminMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){// 简单管理员验证role:=c.GetHeader("Role")ifrole!="admin"{c.JSON(403,gin.H{"error":"Forbidden"})c.Abort()return}c.Next()}}funcmain(){r:=gin.Default()// 根分组(Engine 本身)r.GET("/",func(c*gin.Context){c.JSON(200,gin.H{"message":"Root path"})})// API 分组api:=r.Group("/api"){api.GET("/health",func(c*gin.Context){c.JSON(200,gin.H{"status":"ok"})})// 用户相关接口users:=api.Group("/users")users.Use(AuthMiddleware())// 用户接口需要认证{users.GET("/",func(c*gin.Context){c.JSON(200,gin.H{"users":[]string{"user1","user2"}})})users.GET("/:id",func(c*gin.Context){id:=c.Param("id")c.JSON(200,gin.H{"id":id,"name":"John"})})users.POST("/",func(c*gin.Context){c.JSON(201,gin.H{"message":"User created"})})}// 管理员接口admin:=api.Group("/admin")admin.Use(AuthMiddleware(),AdminMiddleware())// 需要认证+管理员权限{admin.GET("/dashboard",func(c*gin.Context){c.JSON(200,gin.H{"message":"Admin dashboard"})})admin.GET("/users",func(c*gin.Context){c.JSON(200,gin.H{"message":"Admin users list"})})}}// 静态文件static:=r.Group("/static")static.Static("/files","./files")// 静态文件服务r.Run()}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 17:52:19

Win10系统安装Multisim14.0核心要点说明

在 Windows 10 上成功安装 Multisim 14.0 的实战指南:绕过兼容性陷阱,一次搞定你有没有试过在新电脑上装一个“老但经典”的软件,结果点开安装包就闪退?或者提示“无法连接到 NI 服务”、“驱动未签名”……没错,这就是…

作者头像 李华
网站建设 2026/6/13 10:50:29

Dify与云原生架构整合:实现弹性伸缩的AI服务平台

Dify与云原生架构整合:实现弹性伸缩的AI服务平台 在企业争相布局生成式AI的今天,一个现实问题摆在面前:如何让大模型能力快速落地、稳定运行,并能随业务增长灵活扩展?传统开发方式往往陷入“开发周期长、部署复杂、扩缩…

作者头像 李华
网站建设 2026/6/12 20:56:45

模拟电子技术基础中的反馈原理完整指南

模拟电子技术中的反馈原理:从基础到实战的系统解析在模拟电路的世界里,反馈不是个抽象概念,而是一种实实在在、左右电路命运的设计“魔法”。它能让一个原本不稳定、非线性严重的放大器变得精准可靠;也能让一个安静的系统突然“自…

作者头像 李华
网站建设 2026/6/12 16:36:56

Dify实战案例分析:某电商公司如何用它构建智能问答系统

Dify实战案例分析:某电商公司如何用它构建智能问答系统 在电商行业,用户每天提出的问题成千上万——“这款耳机续航多久?”、“订单什么时候发货?”、“支持七天无理由退货吗?”……传统客服团队疲于应对,响…

作者头像 李华
网站建设 2026/6/17 18:26:06

USB协议枚举中的描述符交换:全面讲解请求与响应流程

USB枚举中的描述符交换:从握手到激活的完整通信解析你有没有遇到过这样的情况——把一个新买的USB设备插上电脑,几秒钟后系统就自动识别出“HID键盘”或“Mass Storage Device”,甚至弹出驱动安装提示?这一切看似理所当然的背后&a…

作者头像 李华
网站建设 2026/6/13 1:01:52

React Native搭建环境核心要点:一文说清所有步骤

从零开始搭建 React Native 开发环境:一次讲透所有关键细节 你是不是也经历过这样的时刻?兴致勃勃想用 React Native 写个 App,结果刚打开文档就卡在了第一步—— 环境怎么都配不起来 。 gradle failed to sync 、 could not find JDK …

作者头像 李华