gin源码分析(1)--初始化中间件,路由组与路由树

目标

  1. 关于gin.Default(),gin.New(),gin.Use()
  2. group与子group之间的关系,多group与middleware之间关系
  3. 中间件的类型,全局,group,get,不同类型的中间件什么时候执行。中间件 next 和abort行为
  4. 如何实现http请示请求?http并发如何处理,middleware的context是什么

基本用法

func initMiddleware(ctx *gin.Context) {
    fmt.Println("全局中间件 通过 r.Use 配置")
    // 调用该请求的剩余处理程序
    ctx.Next()
    // 终止调用该请求的剩余处理程序
    //ctx.Abort()
}

//0. 初始化
r := gin.Default()

//1. 全局中间件
r.Use(initMiddleware)

//2. group与子group,类型为RouterGroup
adminRouter := router.Group("/admin", initMiddleware)
userRouter  := adminRouters.Group("/user", initMiddleware)

//3. 请求
userRouters.GET("/user", initMiddleware, controller.UserController{}.Index)

//4. 中间件共享数据
ctx.Set("username", "张三")
username, _ := ctx.Get("username")

关于初始化

使用流程中涉及到几个重要的结构体

gin.Engine,gin.Context,gin.RouterGroup

gin.Default(),gin.New(),gin.Use()
func Default() *Engine {
	// 初始化一个新的Egine
	engine := New()
    // 默认注册全局中间件Logger()和Recovery()
    //Logger()定义一个中间件,实现每次请求进来的日志打印
    //可以配置日志的过滤路径,打印颜色,打印的位置等 
    //Recovery()定义一个中间件,用来拦截运行中产生的所有panic,输出打印并返回500
    //同样可以配置全局panic拦截的行为
    //如果要配置Logger与Recovery则直接在应用中使用gin.New()。然后再在应用中调用
    //engine.Use(LoggerWithFormatter(xxxx), RecoveryWithWriter(xxxx))。
	engine.Use(Logger(), Recovery())
	return engine
}

//初始化Engine
func New() *Engine {
	engine := &Engine{
        //初始化化第一个RouterGroup, root表示是否为根RouterGroup
		RouterGroup: RouterGroup{
			Handlers: nil,
			basePath: "/",
			root:     true,
		},
		FuncMap:                template.FuncMap{},
		TrustedPlatform:        defaultPlatform,
		MaxMultipartMemory:     defaultMultipartMemory,
        //请求方法数组,GET,POST,DELETE,每个方法下面有个链表
		trees:                  make(methodTrees, 0, 9),
		delims:                 render.Delims{Left: "{
  
  {", Right: "}}"},
        //已删除部分配置项
	}
    //给第一个Group配置engine,也就是本engine
	engine.RouterGroup.engine = engine
	engine.pool.New = func() any {
		return engine.allocateContext(engine.maxParams)
	}
    
	return engine
}

//注册全局中间件
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
    //把middleware函数append到上面创建的engine的根RouterGroup的Handlers数组中 
	engine.RouterGroup.Use(middleware...)
    //初始化404和405处理的中间间
	engine.rebuild404Handlers()
	engine.rebuild405Handlers()
	return engine
}

Engine继承了RouterGroup,gin.Default()初始化了Engine与第一个RouterGroup,并初始化了两个默认的中间件,Logger(), Recovery(),他们的作用与配置上面代码中有介绍

gin.Use的核心功能为把传入进来的中间件合并到RouterGroup的Handlers数组中,代码如下

group.Handlers = append(group.Handlers, middleware...)
重要的结构体
type HandlerFunc func(*Context)
type HandlersChain []HandlerFunc

type RouterGroup struct {
    Handlers HandlersChain
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值