gin context和官方context_Gin源码简要分析

本文深入分析了Gin框架的源码,包括Engine的ServeHTTP函数、RouterGroup与MethodTree的路由注册和匹配、HandlerFunc的定义以及Context的核心功能,如调用链流转、参数解析和响应处理。通过对gin.DEMO的解读,展示了 Gin 中路由、中间件、分组和处理函数的工作流程,并探讨了如何在Context中获取Path Param。
摘要由CSDN通过智能技术生成

概述

通过日常对gin场景出发,深入源码,总结介绍gin的核心设计。包含:Engine / HandlerFunc / RouterGroup(Router) / Context。在日常使用中常见的就以上概念,汇总如下:

88e3328d53889acc30161de687032fd0.png

从DEMO开始

type barForm struct {
    
    Foo string  `form:"foo" binding:"required"`
    Bar int     `form:"bar" binding:"required"`
}

func (fooHdl FooHdl) Bar(c *gin.Context) {
    
    var bform = new(barForm)
    if err := c.ShouldBind(bform); err != nil {
    
        // true: parse form error
        return
    }

    // handle biz logic and generate response structure
    // c (gin.Context) methods could called to support process-controling

    c.JSON(http.StatusOK, resp)
    // c.String() alse repsonse to client
}

// mountRouters .
func mountRouters(engi *gin.Engine) {
    
    // use middlewares
    engi.Use(gin.Logger())
    engi.Use(gin.Recovery())

    // mount routers
    group := engi.Group("/v1")
    {
    
        fooHdl := demohtp.New()
        group.GET("/foo", fooHdl.Bar)
        group.GET("/echo", fooHdl.Echo)
        // subGroup := group.Group("/subg")
        // subGroup.GET("/hdl1", fooHdl.SubGroupHdl1) // 最终路由:"targetURI = /v1/subg/hdl1"
    }
}

func main() {
    
    engi := gin.New()

    mountRouters(engi)

    if err := engi.Run(":8080"); err != nil {
    
        log.Fatalf("engi exit with err=%v", err)
    }
}

通过上述的代码就简单开启了一个gin server,其中就包括了常见的:路由注册,中间件注册,路由分组,服务启动。核心概念也就是刚刚在上文提到的那四个概念。概览流程如下图:

1b8fdfaffb8b61ce91ffc752a24910ed.png
gin 调用概览

可以参照DEMO中的方法名在图中检索改流程。

Engine

// Engine is the framework's instance, it contains the muxer, middleware and configuration settings.
type Engine struct {
    
    // 路由管理
    RouterGroup

    // 省略非关心属性
    // ...

    // context poo,支持context复用,减少对象创建提高性能。
    pool             sync.Pool

    // []methodTree方法树根节点集合 这部分在路由部分会详细介绍
    trees            methodTrees 
}

Engine是根入口,它把RouterGroup结构图体嵌入自身,以获得了Group,GET,POST等路由管理方法。从 Run方法的代码:

因为直接复制代码太多了,推荐下载源码来跳转,更便捷高效。
func (engine *Engine) Run(addr ...string) (err error) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值