j

jaryue

V1

2023/03/28阅读:8主题:默认主题

goweb框架day4

  1. 实现路由分组控制(Route Group Control)

什么是分组

前缀来区分,并且支持分组的嵌套。例如/post是一个分组,**/post/a和/post/b可以是该分组下的子分组**

作用

作用在/post分组上的中间件(middleware),也都会作用在子分组,子分组还可以应用自己特有的中间件。 (什么中间件在后面会学)

  1. 建立一个节点RouterGroup,储存分组的各种属性
type RouterGroup struct {
 Prefix      string               //父元素的字符串
 Middlewares []router.HandlerFunc //中间件函数
 Parent      *RouterGroup         //父元素的节点
 Engine      *Engine              //所有的分组公用一个engine以实现所有的函数的接口
}
  1. 重定义engine节点,新添加RouterGroup与groups属性,用于储存分组以及可调用RouterGroup中的所有属性
type Engine struct {
 *RouterGroup                 //分组
 Router       *router.Rrouter //路由的映射
 Groups       []*RouterGroup  // 储存所有的分组
}
  1. 定义group函数,在当前路由分组下创建一个子分组,可以通过传入前缀字符串来指定子分组的前缀,该函数会返回一个新的 RouterGroup 对象,表示创建的子分组。在创建子分组时,需要指定父分组和引擎节点。
    该函数的实现主要是创建一个新的 RouterGroup 对象,将该对象的 Prefix 属性设置为当前分组的 URL 前缀与传入的参数前缀拼接得到的新前缀,将该对象的 Parent 属性设置为当前分组,将该对象的 Engine 属性设置为当前分组的 Engine 属性,然后将该对象添加到当前分组的 Engine 对象的 Groups 数组中。这样,可以通过调用该函数来创建一个新的路由分组,并将其添加到路由分组树中。
// 在当前路由分组下创建一个子分组,可以通过传入前缀字符串来指定子分组的前缀,该函数会返回一个新的 RouterGroup 对象,表示创建的子分组。在创建子分组时,需要指定父分组和引擎节点。
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
}
  1. 重定义addroute函数,该函数的实现主要是调用 Engine 的 Router 对象的 AddRoute 方法来添加路由映射。在调用该方法前,需要将 comp 参数与 group 对象的 Prefix 属性合并,以获取完整的 URL 模式。然后,通过调用 Engine 对象的 Router 的 AddRoute 方法,将请求方法、URL 模式和路由处理函数注册到路由映射表中。这样,当客户端请求该 URL 时,将自动调用注册的路由处理函数来处理该请求。
func (group *RouterGroup) AddRoute(method string, comp string, handler router.HandlerFunc) {
 pattern := group.Prefix + comp//父元素+当前的参数组成路由
 log.Printf("Route %4s - %s", method, pattern)
 group.Engine.Router.AddRoute(method, pattern, handler) //添加路由映射
}

分类:

后端

标签:

Golang

作者介绍

j
jaryue
V1