Gin使用路由组分类处理请求——Go Gin框架(五)

路由组功能

在实际项目开发中,均是模块化开发。同一模块的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接口,该接口包含了GETPOST等方法,通过这些方法可以实现该路由组中的具体实现方法。

附: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
}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注