洋葱模型
package main
import (
"fmt"
"math"
)
// 中间件索引长度 微服务,handler过多应拆分服务
const abortIndex int8 = math.MaxInt8 >> 1
type Context struct {
handlers []func(ctx *Context)
index int8
}
func (c *Context) Abort() {
c.index = abortIndex
}
func (c *Context) Use(f func(ctx *Context)) {
c.handlers = append(c.handlers, f)
}
func (c *Context) Get(path string, f func(ctx *Context)) {
fmt.Println("Get Function")
c.handlers = append(c.handlers, f)
}
// Next 进入下一个中间件
func (c *Context) Next() {
c.index++
for c.index < int8(len(c.handlers)) {
c.handlers[c.index](c)
c.index++
}
}
func (c *Context) Run() { //
if len(c.handlers) > 0 {
c.handlers[0](c)
c.Next()
}
}
func main() {
c := Context{}
c.Use(func(ctx *Context) {
fmt.Println("中间件1 开始执行")
c.Next()
fmt.Println("中间件1 执行完毕")
})
c.Use(func(ctx *Context) {
fmt.Println("中间件2 开始执行")
ctx.Next()
fmt.Println("中间件2 执行完毕")
})
c.Use(func(ctx *Context) {
fmt.Println("中间件3 开始执行")
ctx.Next()
fmt.Println("中间件3 执行完毕")
})
c.Get("/", func(ctx *Context) {
fmt.Println("do get")
})
fmt.Println(c.handlers)
c.Run()
}