路由组功能
在实际项目开发中,均是模块化开发。同一模块的API接口一般会有相同的接口前缀。
例如,对于一个xx管理模块,会有“xx添加”、“xx删除”、“xx修改”、“xx查询”。
一个学生管理模块的API如下:
学生注册:/student/Add
学生删除:/student/Delete
学生修改:/student/Modify
学生查询:/student/Search
路由组
Gin框架为我们提供了路由组功能。
func group(engine *gin.Engine) {
userGroup := engine.Group("/user")
//visit /user/Add
userGroup.POST("/Add", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//业务处理逻辑
})
//visit /user/Delete/:id
userGroup.POST("/Delete/:id", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//业务处理逻辑
})
//visit /user/Modify/:id
userGroup.POST("/Modify/:id", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//业务处理逻辑
})
//visit /user/Search?id=
userGroup.GET("/Search", func(context *gin.Context) {
fmt.Println("request route: ", context.FullPath())
//业务处理逻辑
})
}
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup
:该函数用于定义一个group
即一个公共的访问前缀。relativePath string
:相对路径,即公共前缀名。handlers ...HandlerFunc
:处理函数,由于是可变长度参数,故这里占时为空。
根据type RouterGroup struct
的源码:
type RouterGroup struct {
Handlers HandlersChain
basePath string
engine *Engine
root bool
}
var _ IRouter = &RouterGroup{}
可以看到其实现了一个IRouter
接口,该接口包含了GET
、POST
等方法,通过这些方法可以实现该路由组中的具体实现方法。
附:IRouter接口的声明
type IRoutes interface {
Use(...HandlerFunc) IRoutes
Handle(string, string, ...HandlerFunc) IRoutes
Any(string, ...HandlerFunc) IRoutes
GET(string, ...HandlerFunc) IRoutes
POST(string, ...HandlerFunc) IRoutes
DELETE(string, ...HandlerFunc) IRoutes
PATCH(string, ...HandlerFunc) IRoutes
PUT(string, ...HandlerFunc) IRoutes
OPTIONS(string, ...HandlerFunc) IRoutes
HEAD(string, ...HandlerFunc) IRoutes
StaticFile(string, string) IRoutes
Static(string, string) IRoutes
StaticFS(string, http.FileSystem) IRoutes
}