news 2026/4/26 14:58:00

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/4/26 1:47:20

虚拟串口驱动中IRP请求处理的系统学习

深入Windows内核:虚拟串口驱动中IRP请求的实战解析你有没有遇到过这样的场景?一个老旧的工业控制软件,死死依赖于COM1、COM2这种“古董级”串口通信,而现代PC早已砍掉了物理RS-232接口。怎么办?总不能为了运行它再去买…

作者头像 李华
网站建设 2026/4/25 13:27:35

WinDbg入门必读:深度剖析栈回溯基本操作

WinDbg栈回溯实战:从崩溃现场还原程序执行路径你有没有遇到过这样的场景?服务器上的某个服务突然崩溃,日志里只留下一句“访问违规”,开发环境却怎么也复现不了。这时候,一个小小的.dmp文件就成了唯一的破案线索。在Wi…

作者头像 李华
网站建设 2026/4/24 22:25:31

Dify可视化界面实测:非程序员也能玩转Agent开发

Dify可视化界面实测:非程序员也能玩转Agent开发 在企业智能化转型的浪潮中,一个现实问题反复浮现:大模型能力越来越强,但业务部门想用起来却依然“够不着”。产品经理有清晰的场景构想,比如做个自动回复客户咨询的客服…

作者头像 李华
网站建设 2026/4/25 11:43:20

嵌入式Linux下ioctl函数调用全面讲解

深入理解嵌入式Linux中的ioctl:从原理到实战在嵌入式开发的世界里,我们常常需要与硬件“对话”——读取传感器数据、控制GPIO电平、配置串口通信参数。这些操作看似简单,但背后却隐藏着一个关键问题:如何让用户空间的应用程序安全…

作者头像 李华
网站建设 2026/4/25 1:07:42

从零实现:基于css vh的全视口Grid布局

用vh和 Grid 搭出真正“全屏自适应”的页面,一招解决多端布局难题你有没有遇到过这样的问题:在设计一个登录页或后台系统时,明明写了height: 100%,结果页面就是撑不满屏幕?或者在手机上测试时,发现底部被软…

作者头像 李华