gin 结构分析

|-- 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 // 保存路由信息 采用前缀树数据结构
}

你可能感兴趣的:(gin 结构分析)