Gin是 用go 语言开发的web
框架 提供类 Martini
的api
Gin优点
- 高性能:犹如采用了
httprouter
库,gin的性能非常出色,比同类框架快了40倍 - 易用性: gin提供了内置的功能,轻松实现web开发
- 扩展性: gin 具有插件机制,可以方便扩展框架的功能
gin 框架的核心
- 路由匹配处理
- 中间件机制
- 上下文管理
- 异常处理
- 并发处理
路由处理
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
函数使用中间件