学习网站来源:Gee
相当于上一篇,这节只改变了gee/gee.go文件,其他文件一样
路由分组是指将相似的路由规则分组到一起,以便更好地管理和维护路由
就比如在网络中,路由分组可以根据不同的需求进行分类,比如按照目的地、协议类型、服务类型等进行分组。
group/gee/gee.go
package gee
import (
"log"
"net/http"
)
// HandlerFunc defines the request handler used by gee
type HandlerFunc func(*Context)
type (
//包含了前缀prefix、中间件middlewares、父分组parent以及引擎实例engine
RouterGroup struct {
prefix string
middlewares []HandlerFunc // 支持中间件
parent *RouterGroup // 支持嵌套
engine *Engine // 所有组共享一个Engine实例
}
//实现了ServeHTTP接口,同时包含了RouterGroup和router以及存储所有分组的groups
Engine struct {
*RouterGroup
router *router
groups []*RouterGroup // 存储所有组
)
func New() *Engine {
engine := &Engine{router: newRouter()}
engine.RouterGroup = &RouterGroup{engine: engine}
engine.groups = []*RouterGroup{engine.RouterGroup}
return engine
}
/*
用于创建新的路由分组
在这个方法中,根据传入的前缀创建一个新的RouterGroup实例,并将其添加到Engine的groups中
*/
func (group *RouterGroup) Group(prefix string) *RouterGroup {
engine := group.engine
newGroup := &RouterGroup{
prefix: group.prefix + prefix,
parent: group,
engine: engine,
}
engine.groups = append(engine.groups, newGroup)
return newGroup
}
/*
用于向路由表中添加路由规则
在这个方法中,根据传入的HTTP方法、路由模式和处理函数,构建完整的路由模式,并将其添加到路由表中
*/
func (group *RouterGroup) addRoute(method string, comp string, handler HandlerFunc) {
pattern := group.prefix + comp
log.Printf("Route %4s - %s", method, pattern)
group.engine.router.addRoute(method, pattern, handler)
}
func (group *RouterGroup) GET(pattern string, handler HandlerFunc) {
group.addRoute("GET", pattern, handler)
}
func (group *RouterGroup) POST(pattern string, handler HandlerFunc) {
group.addRoute("POST", pattern, handler)
}
func (engine *Engine) Run(addr string) (err error) {
return http.ListenAndServe(addr, engine)
}
//实现了http.Handler接口,用于处理HTTP请求,它会创建一个新的上下文对象,并调用路由表的处理方法来处理请求
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
c := newContext(w, req)
engine.router.handle(c)
}