|-- binding 将请求的数据对象化并校验
|-- examples 各种列子
|-- json 提供了另外一种json实现
|-- render 渲染
|-- gin.go gin引擎
|-- gin_test.go
|-- routes_test.go
|-- context.go 上下文
|-- context_test.go
|-- response_writer.go 响应的数据输出
|-- response_writer_test.go
|-- errors.go 错误处理
|-- errors_test.go
|-- tree.go 路由存储结构的具体实现
|-- tree_test.go
|-- routergroup.go 路由组
|-- routergroup_test.go
|-- auth.go 鉴权的中间件
|-- auth_test.go
|-- logger.go 日志中间件
|-- logger_test.go
|-- recovery.go 崩溃处理中间件
|-- recovery_test.go
|-- mode.go 应用模式
|-- mode_test.go
|-- utils.go 工具类
|-- utils_test.go
按照字母排序解释模块
Bind
内置的有json, xml, protobuf, form, query, yaml. 这些Bind极大的减少我们自己去解析各种个样的数据格式, 提高我们的开发速度
Bind的实现都在gin/binding里面. 这些内置的Bind都实现了Binding接口, 主要是Bind()和Name函数.
ginS
This is API experiment for Gin.
package main
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/ginS"
)
func main() {
ginS.GET("/", func(c *gin.Context) { c.String(200, "Hello World") })
ginS.Run()
}
context
HTTP请求上下文处理,使用sync pool实现
// Context作为一个数据结构在中间件中传递本次请求的各种数据、管理流程,进行响应
type Context struct {
// ServeHTTP的第二个参数: request
Request *http.Request
// 用来响应
Writer ResponseWriter
writermem responseWriter
// URL里面的参数,比如:/xx/:id
Params Params
// 参与的处理者(中间件 + 请求处理者列表)
handlers HandlersChain
// 当前处理到的handler的下标
index int8
// Engine单例
engine *Engine
// 在context可以设置的值
Keys map[string]interface{}
// 一系列的错误
Errors errorMsgs
// Accepted defines a list of manually accepted formats for content negotiation.
Accepted []string
}
gin
gin 是核心部件,https://godoc.org/github.com/gin-gonic/gin#New
初始化 Engine 对象, 关键步骤: 初始化 路由组
初始化 pool, 这是核心步骤. pool 用来存储 context 上下文对象.trees保存路由信息。
type Engine struct {
RouterGroup
RedirectTrailingSlash bool
RedirectFixedPath bool
HandleMethodNotAllowed bool
ForwardedByClientIP bool
AppEngine bool
UseRawPath bool
UnescapePathValues bool
MaxMultipartMemory int64
delims render.Delims
secureJsonPrefix string
HTMLRender render.HTMLRender
FuncMap template.FuncMap
allNoRoute HandlersChain
allNoMethod HandlersChain
noRoute HandlersChain
noMethod HandlersChain
pool sync.Pool //保存上下文
trees methodTrees // 保存路由信息 采用前缀树数据结构
}