通過這篇 [Gin] 單文件極簡 HTTP Server 流程分析 ( gin-gonic/gin )
我們知道了 gin.go 中的 Engine 繼承有 routergroup.go 中的 RouterGroup 結構,從而獲得其所有方法。
RouterGroup 結構有一個方法 Group 是處理分組的,返回新的路由分組實例,分組的目的可以是出於路徑歸類 或者 為了使用相同的中間件。
// routergroup.go
// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix. // For example, all the routes that use a common middleware for authorization could be grouped. func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup { return &RouterGroup{ Handlers: group.combineHandlers(handlers), basePath: group.calculateAbsolutePath(relativePath), engine: group.engine, } } // BasePath returns the base path of router group. // For example, if v := router.Group("/rest/n/v1/api"), v.BasePath() is "/rest/n/v1/api". func (group *RouterGroup) BasePath() string { return group.basePath } func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { absolutePath := group.calculateAbsolutePath(relativePath) handlers = group.combineHandlers(handlers) group.engine.addRoute(httpMethod, absolutePath, handlers) return group.returnObj() }
應用:
// example.go func main() { router := gin.Default() // Simple group: v1 v1 := router.Group("/v1")
{ v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 v2 := router.Group("/v2")
{ v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) } router.Run(":8080") }
Group 只是一個函數,上面花括號是代表中間的語句屬於一個空間內,不受外界干擾,C語言中也有塊空間的語法。