跳到主要内容

Gin 框架数据结构

· 阅读需 5 分钟
ahKevinXy

Gin是 用go 语言开发的web框架 提供类 Martini的api

Gin优点

  • 高性能:犹如采用了 httprouter 库,gin的性能非常出色,比同类框架快了40倍
  • 易用性: gin提供了内置的功能,轻松实现web开发
  • 扩展性: gin 具有插件机制,可以方便扩展框架的功能

gin 框架的核心

  1. 路由匹配处理
  2. 中间件机制
  3. 上下文管理
  4. 异常处理
  5. 并发处理

路由处理

gin 使用了 基数树(Radix Tree) 来管理路由,将路由分解多个节点,通过匹配路径的前缀来快速找到对应的路由处理函数,当有新的路由注册时,gin会根据路径构建新的节点,并将处理的函数与节点绑定.在请求到来时,gin会从根节点开始遍历路由树,根据请求路径匹配到对应的处理函数进行执行

中间件机制

gin 的中间件机制是通过方法链实现的.每个中间件都是一个函数,它接受上下文对象(context) 和函数(next),并在执行过程中可以处理请求和响应,然后通过调用next(),将函数控制权交给下一个中间件.这样多个中间件可以形成一个链式调用的过程,依次对请求进行处理

上下文管理

gin的上下文对象(context)封装了一次http请求的上下文信息,包括请求参数,请求头,响应内容.在处理过程中,可以通过上下文对象获取和设置这些信息.gin将上下文对象作为参数传递给中间件和路由处理函数,实现了这些函数之间共享数据和状态的能力

异常处理

gin 内置了对异常处理的机制,当发生异常,gin会捕获异常并返回一个合适的错误响应,同时 gin内置了一些辅助方法, Abort() AbortWithStatus() 用于处理过程中终止请求并返回特定的错误响应

并发处理

gin框架使用了goroutine来实现并发处理请求,每个请求都会在独立的goroutine中执行

Engine 结构体

package gin

type HandlerFunc func(*Context)
type RouteInfo struct {
Method string
Path string
Handler string
HandlerFunc HandlerFunc
}
type Engine struct {

// 路由组
RouteGroup

// 启用自动重定向,如果当前路由无法匹配但存在没有尾部斜杆的路径的处理程序
RedirectTrailingSlash bool

// 如果启用,路由器将尝试修复当前请求路径
RedirectFixedPath bool

// 如果启用,路由器将检查当前路由是否允许其它使用方法
HandleMethodNotAllowed bool

// 如果启用,将从请求头中解析 匹配客户端ip
ForwardedByClientIP bool
//
AppEngine bool
// 如果启用 将使用 url.Path
UseRawPath bool

//
UnescapePathValues bool

// RemoveExtraSlash即使有额外的斜杠,也可以从URL中解析参数。
// 参见PR#1817和问题#1644
RemoveExtraSlash bool

// RemoteIPHeaders用于在`(*gin.Engine).ForwardedByClientIP`为`true`且
// `(*gin.Context).Request.RemoteAddr`匹配`(*gin.Engine).SetTrustedProxies()`定义的网络源列表之一时,
// 获取客户端IP的头部列表。
RemoteIPHeaders []string

// TrustedPlatform如果设置为值为gin.Platform*的常数,将信任该平台设置的头部,例如用于确定客户端IP
TrustedPlatform string

// MaxMultipartMemory是传递给http.Request的ParseMultipartForm方法调用的'maxMemory'参数的值。
MaxMultipartMemory int64

// UseH2C启用h2c支持。
UseH2C bool

// ContextWithFallback在Context.Request.Context()不为nil时,启用回退Context.Deadline(),Context.Done(),Context.Err()和Context.Value()。
ContextWithFallback bool

delims render.Delims
secureJSONPrefix string
HTMLRender render.HTMLRender
FuncMap template.FuncMap
allNoRoute HandlersChain
allNoMethod HandlersChain
noRoute HandlersChain
noMethod HandlersChain
pool sync.Pool
// 方法树列表
trees methodTrees
maxParams uint16
maxSections uint16
trustedProxies []string
trustedCIDRs []*net.IPNet



}

RouterGroup 结构体

package gin

type RouterGroup struct {
Handlers HandlesChain // 储存将要执行的函数,包括路由中间件和路由函数
basePath string // 路径
engine *Engine // 指向根结构体
root bool // 标志是否是根结构体
}

Use 方法使用中间件

Use 方法,一般使用Use 函数使用中间件