背景

在实际的项目开发中,均是模块化开发。同一模块内的功能接口,往往会有相同的接口前缀。比如如下所示:

例如在系统中有用户模块,用户有不同注册、登录、用户信息、

注册http://localhost:9000/user/register
登录http://localhost:9000/user/login
用户信息http://localhost:9000/user/info
删除http://localhost:9000/user/1001

类似这种接口前缀统一,均属于相同模块的功能接口。可以使用路由组进行分类处理。

Group

gin框架中可以使用路由组来实现对路由的分类。

路由组是router.Group中的一个方法,用于对请求进行分组。如下案例所示:

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main(){
	engine  :=gin.Default()
	userGroup := engine.Group("/user")
	userGroup.GET("/register", func(context *gin.Context) {
		fullPath := " 用户注册功能 " + context.FullPath()
		fmt.Println(fullPath)
		context.Writer.WriteString(fullPath)
	})

	engine.Run(":9001")

	engine.Run()
}

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main(){
	engine  :=gin.Default()
	userGroup := engine.Group("/user")
	userGroup.GET("/register", registerHandle)
	userGroup.GET("/login", loginHandle)
	userGroup.GET("/info", infoHandle)

	engine.Run(":9001")

	
}
func registerHandle(context *gin.Context) {
	fullPath := " 用户注册功能 " + context.FullPath()
	fmt.Println(fullPath)
	context.Writer.WriteString(fullPath)
}

func loginHandle(context *gin.Context) {
	fullPath := " 用户登录功能 " + context.FullPath()
	fmt.Println(fullPath)
	context.Writer.WriteString(fullPath)
}

func infoHandle(context *gin.Context) {
	fullPath := " 信息查看功能 " + context.FullPath()
	fmt.Println(fullPath)
	context.Writer.WriteString(fullPath)
}

Group返回一个RouterGroup指针对象,而RouterGroup是gin框架中的一个路由组结构体定义。我们来看一下RouterGroup的定义如下所示:

type RouterGroup struct {
    Handlers HandlersChain
    basePath string
    engine   *Engine
    root     bool
}

RouterGroup实现了IRoutes中定义的方法,包含统一处理请求的Handle和分类型处理的GET、POST等。IRouters定义如下所示:

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
}