内容来自:公开课(8):月经面试题之gin的中间件原理和简单手撸_哔哩哔哩 一、go洋葱模型图
二、中间件模拟示例代码
package mainimport "fmt"type Context struct {handlers []func(c *Context)// 保存handler函数的切片index int8//记录handler切片的当前位置}// Use 将一个要执行的handler函数放到 handlers切片中func(this *Context) Use(f func(c *Context)) {this.handlers = append(this.handlers,f)}// Get 将一个要执行的handler函数放到 handlers切片中func(this *Context) Get(path string,f func(c *Context)){this.handlers = append(this.handlers,f)}// Next 执行handlers 切片列表中的下一个handler函数func(this *Context) Next() {this.index++this.handlers[this.index](this) //剥洋葱的下一层}// Run 启动开始执行 handlers切片中第一个 handler函数func(this *Context) Run() {this.handlers[0](this) //剥洋葱,第一层}func main() {c := &Context{}c.Use(Middleware1())c.Use(Middleware2())c.Get("/", func(c *Context) {fmt.Println("Get handlerfuncrun")})c.Run()}// Middleware1 中间件函数 返回一个带有具体业务的handler函数func Middleware1() func(c *Context) {return func(c *Context) {fmt.Println("middl1 --- start")c.Next() //执行下一个handler函数fmt.Println("middl1 --- end")}}// Middleware2 中间件函数 返回一个带有具体业务的handler函数func Middleware2() func(c *Context) {return func(c *Context) {fmt.Println("middl2 --- start")c.Next() //执行下一个handler函数fmt.Println("middl2 --- end")}}
文章插图
执行结果:
三、理解代码实现
1. 对象可以保存 可执行的函数列表
文章插图
2.Use函数执行的目的是将 某个可执行的函数追加到函数列表中,而这追加的函数里携带有 Next函数 。按照程序执行顺序,那么其意思是执行某个函数的一半时,在中间插入一段另一个函数的执行,如果另一个函数执行完,那么就继续执行当前函数后半段 。如下代码示例:
package mainimport "fmt"func main() {F1()}func F1() {fmt.Println("F1 start")// Next() 执行下一个函数(相当于F1中间插入一段代码)F2()fmt.Println("F1 end")}func F2() {fmt.Println("F2 start")fmt.Println("F2 end")}
执行结果:
【go 中间件洋葱模型】3.Get函数,则是没有Next()执行的函数,即洋葱的最中间,列表中最后一个函数了,执行完后则逐步执行上一个函数的后半段,一层层返回到外面
- koa2洋葱模型
- stable diffusion 1.5大模型炼制详细教程,几块钱即可炼制大模型
- 软件质量模型概述
- 关于pytorch lightning保存模型的机制
- 3.2.1 ER图转换为关系模型
- 五 CNN经典网络模型:ResNet简介及代码实现(PyTorch超详细注释版
- 分割一切模型 Fast SAM C++推理部署
- 密码学学习笔记 1.传统加密技术——对称密码模型简介
- 四两拨千斤!AI大牛周明率澜舟团队刷新CLUE新纪录,轻量化模型孟子一鸣惊人
- node.js中的Express-路由-express中间件