GEE 基本框架篇 -- 路由篇之RouterGroup

文章介绍了GEE框架中RouterGroup的概念和作用,它是用于组织和管理路由的结构体,允许对路由进行分组并添加前缀。RouterGroup包含中间件、父路由和引擎等属性,并提供了创建静态文件服务器、添加路由和使用中间件的方法。在Engine内部,RouterGroup通过groups存储,处理请求时会根据URL路径匹配并应用对应的中间件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GEE 基本框架篇 – 路由篇之RouterGroup

详细可查看https://github.com/OddSpilit/gee/routerGroup.go 源码

  • 通常我们都会需要把路由做一个分组,让注册的路由属于某个组的情况。这块代码有router基础的情况下是非常好实现的,现在我们来进入正题🧑‍🔧

RouterGroup

  • 我们先来看看RouterGroup的结构体以及其方法
RouterGroup
prefix string
middleWares []HandlerFunc
parent *RouterGroup
engine *Engine
Group
addRoute
GET
POST
Use
createStaticHandler
Static
  • 结构分析

    • prefix:路由分组的前缀,会在之前路由的基础上加上前缀来实现分组功能。
    • middleWares:中间件。
    • parent:父母路由节点。
    • engine:引擎注入。
  • 方法分析

    • Group:向外暴露创建实例方法。
    • addRoute:依赖engine.routeraddRoute操作,在此基础上拼接上自己的prefix
    • GET && POST:基于addRoute创建一个路由。
    • Use:添加中间件。
    • createStaticHandler:创建服务静态目录,返回一个HandlerFunc类型。
    • Static:调用createStaticHandler返回的handler注册一个路由。代码如下:
    func (group *RouterGroup) Static(relativePath, root string) {
       handler := group.createStaticHandler(relativePath, http.Dir(root))
       urlPattern := path.Join(relativePath, "/*filepath")
       group.GET(urlPattern, handler)
    }
    

代码调用过程

package gee

import (
	"gee/gee/middleWares"
	"net/http"
)

/*
*
注册路由
*/
func InitRouter() {
	r := New()
	r.Static("/assets", "./gee/static")
	r.LoadHtmlGlob("./gee/templates/*")
	v1 := r.Group("v1")
	v1.Use(middleWares.Logger())
	{
		v1.GET("/hello", func(c *Context) {
			c.HTML(http.StatusOK, "test.tmpl", H{
				"title":   "gee",
				"content": "hello v1",
			})
		})
	}

	v2 := r.Group("v2")
	v2.Use(middleWares.Logger())
	{
		v2.GET("/hello", func(c *Context) {
			c.HTML(http.StatusOK, "test.tmpl", H{
				"title":   "gee",
				"content": "hello v2",
			})
		})
	}

	r.Run(":9999")
}

  • 这一块内容不难,只是在之前router篇基础上加了点小改动。我们今天主要还是要分析一下,RouterGrouprouter里面的作用。我们来简单回顾下router里面关于RouterGroup的结构。
Engine
...
*RouterGroup
groups []*RouterGroup
...
allfunc
  • RouterGroup主要是让engine能直接调用RouterGroup里面的方法操作,主要是创建新的RouterGroup对象,然后填充到groups*里面。
  • groups是会存放新RouterGroup实例对象,他的作用主要是为了中间件调用服务的,代码如下:
// 当请求进来时,如果是某个group的请求,会收集中间件操作,然后传递给Context.handlers
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
   var middleWares []HandlerFunc
   for _, group := range engine.groups {
      if strings.HasPrefix(req.URL.Path, "/"+group.prefix) {
         middleWares = append(middleWares, group.middleWares...)
      }
   }
   c := newContext(w, req)
   c.handlers = middleWares
   c.engine = engine
   engine.router.handle(c)
}

总结

  • 该篇文章我们讲了RouterGroup的结构以及实现方法,比较简单,主要还是看它在engine里面是怎么发挥作用来着。他这块设计还是很有意思来着,通过暴露*RouterGroup成员来实现创建新分组,简化了代码。
  • 目前路由篇就算圆满结束了,接下来我们会继续填坑,下篇文章会填ContextHandlerFunc的坑。😹😹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值