Gin-项目初始化(New)

基于1.10.0

工作原理

Engine核心结构体

graph TD
    A[Engine] --> B[RouterGroup]
    A --> C[trees: methodTrees]
    A --> D[pool: sync.Pool]
    A --> E[HTMLRender]
    A --> F[配置选项]
    
    F --> F1[RedirectTrailingSlash]
    F --> F2[RedirectFixedPath]
    F --> F3[HandleMethodNotAllowed]
    F --> F4[ForwardedByClientIP]
    F --> F5[UseH2C]

路由注册流程

graph TD
    A[AddRoute] --> B{检查路径和方法}
    B --> C[获取对应method的tree]
    C --> D[创建新node如果需要]
    D --> E[调用addRoute添加路由]
    E --> F[更新maxParams和maxSections]
    
    subgraph 核心函数
        A --> A1[addRoute]
        E --> E1[addRoute]
    end

求处理流程

flowchart LR
    A[HTTP请求] --> B[ServeHTTP]
    B --> C[从pool获取Context]
    C --> D[handleHTTPRequest]
    
    subgraph handleHTTPRequest处理流程
        D --> E{查找路由树}
        E --> F[getValue匹配路径]
        F --> G{找到处理器?}
        G -->|是| H[执行中间件链]
        G -->|否| I{MethodNotAllowed?}
        I -->|是| J[处理405]
        I -->|否| K[处理404]
    end
    
    H --> L[Put Context回pool]
    J --> L
    K --> L
    
    subgraph 核心函数
        B --> B1[ServeHTTP]
        C --> C1[allocateContext]
        D --> D1[handleHTTPRequest]
        F --> F1[getValue]
        H --> H1[Context.Next]
        J --> J1[serveError]
        K --> K1[serveError]
    end

中间件执行流程

sequenceDiagram
    participant R as Request
    participant C as Context
    participant M as Middlewares
    participant H as Handler
    
    R->>C: 创建Context
    C->>M: 执行中间件链
    loop 中间件处理
        M->>M: index递增
        M->>M: 执行下一个中间件
    end
    M->>H: 执行最终Handler
    H-->>C: 返回响应
    C-->>R: 写入Response

路由树结构示例

graph TD
    A[root /] --> B[users]
    B --> C[GET: getUsers]
    B --> D[:id]
    D --> E[GET: getUser]
    D --> F[PUT: updateUser]
    D --> G[DELETE: deleteUser]
    
    A --> H[posts]
    H --> I[GET: getPosts]
    H --> J[:id]
    J --> K[GET: getPost]
    
    subgraph 路由节点核心字段
        L[node] --> L1[path]
        L --> L2[fullPath]
        L --> L3[handlers]
        L --> L4[children]
        L --> L5[indices]
    end

详细流程

核心结构体

1

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// New 返回一个新的空白 Engine 实例,不附带任何中间件。
// 默认配置如下:
// - RedirectTrailingSlash: true (自动重定向尾部斜杠)
// - RedirectFixedPath: false(不修复路径)
// - HandleMethodNotAllowed: false(不处理方法不允许的情况)
// - ForwardedByClientIP: true (通过客户端IP转发)
// - UseRawPath: false(不使用原始路径)
// - UnescapePathValues: true (对路径值进行解码)
func New(opts ...OptionFunc) *Engine {
debugPrintWARNINGNew()
engine := &Engine{
RouterGroup: RouterGroup{
Handlers: nil, // 初始化处理器链为空
basePath: "/", // 根路径为 "/"
root: true, // 标记为根路由组
},
FuncMap: template.FuncMap{}, // 模板函数映射
RedirectTrailingSlash: true, // 是否重定向尾部斜杠
RedirectFixedPath: false, // 是否尝试修复路径
HandleMethodNotAllowed: false, // 是否处理不允许的HTTP方法
ForwardedByClientIP: true, // 是否从请求头中获取客户端真实IP
RemoteIPHeaders: []string{"X-Forwarded-For", "X-Real-IP"}, // 用于获取客户端IP的请求头列表
TrustedPlatform: defaultPlatform, // 可信平台设置
UseRawPath: false, // 是否使用原始路径
RemoveExtraSlash: false, // 是否移除多余的斜杠
UnescapePathValues: true, // 是否对路径值进行URL解码
MaxMultipartMemory: defaultMultipartMemory, // 多部分表单数据最大内存
trees: make(methodTrees, 0, 9), // 初始化方法树
delims: render.Delims{Left: "{{", Right: "}}"}, // 模板分隔符
secureJSONPrefix: "while(1);", // 安全JSON前缀
trustedProxies: []string{"0.0.0.0/0", "::/0"}, // 默认信任所有代理
trustedCIDRs: defaultTrustedCIDRs, // 默认信任的CIDR范围
}
engine.engine = engine
// 初始化上下文池,用于复用Context对象
engine.pool.New = func() any {
return engine.allocateContext(engine.maxParams)
}
// 应用传入的配置选项并返回引擎实例
return engine.With(opts...)
}