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")
}
GIN框架的Middleware(中间件)的原理分析
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 原文:http://www.ttlsa.com/golang/gin-middleware-example/ 翻译...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)[#aspnet-co...
- 前言 上次看到了koa-compose的代码,今天来说一下koa中间件的级联以及工作原理。 中间件工作原理 初始化...
- 工程结构如下 原理主要是利用了cookie来保存sessionID。使用sessionID来获取每个用户对应的Se...