GIN框架的Middleware(中间件)的原理分析

package main

import (
    "fmt"
    "math"
)

const abortIndex int8 = math.MaxInt8 / 2

type Context struct {
    Handlers []func(*Context)
    index    int8
}

func (c *Context) Next() {
    c.index++
    for c.index < int8(len(c.Handlers)) {
        c.Handlers[c.index](c)
        c.index++
    }
}

func (c *Context) Abort() {
    c.index = abortIndex
}

func main() {
    c := &Context{}
    c.Handlers = make([]func(*Context), 0)

    // 注册中间件
    c.Handlers = append(c.Handlers, h1)
    c.Handlers = append(c.Handlers, h2)
    c.Handlers = append(c.Handlers, h3)

    // 控制器函数
    c.Handlers = append(c.Handlers, actionHandler)

    // 限制handler个数
    if len(c.Handlers) >= int(abortIndex) {
        panic("too many handlers")
    }

    // 启动
    c.Handlers[0](c)
    c.Next()
}

func actionHandler(c *Context) {
    fmt.Println("action handler")
}

func h1(c *Context) {
    fmt.Println("h1 start")
}

func h2(c *Context) {
    fmt.Println("h2 start")
    c.Abort()
    c.Next()
    fmt.Println("h2 end")
}

func h3(c *Context) {
    c.Next()
    fmt.Println("h3 end")
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容