老师,按您图说的执行c.Next()方法后index++会执行下一个中间件,那当前中间件c.Next()后面的逻辑是什么时候执行呢?

来源:1-13 gin的中间件原理源码分析

Yao_Jerry

2021-06-01 20:39:02

老师,按您图说的执行c.Next()方法后index++会执行下一个中间件,那当前中间件c.Next()后面的逻辑是什么时候执行呢?是执行完c.Next()之前的逻辑,然后执行c.Next(),index++ ,后handlers[index]执行下一个中间件,每个中间件前置方法都执行完后,再重头执行每个中间件c.Next()后面的逻辑吗?



http://img.mukewang.com/climg/60b6298309a5c62509460387.jpg

http://img.mukewang.com/climg/60b62983098e012305470370.jpg


写回答

2回答

爱吃apple的阿狸

2023-03-01

看看c.next()的源码吧,

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

假设A中间件里调用c.next() ,里面首先就是index++,for循环就会去执行B中间件,B中间件又调用c.next(),又会多一个for循环,里面继续执行C路由的真正逻辑,一直调用到最后的路由逻辑,这里有多个for循环嵌套,类似这种:

//A中间件调用c.next()
for c.index < int8(len(c.handlers)) {
      //B中间件调用c.next()
      for c.index < int8(len(c.handlers)) {
          //C中间件里面可以一直嵌套for循环,取决于有多少中间件
          c.handlers[c.index](c)
          c.index++
      }
      c.index++
   }

但index会一直++直到超出范围,因为全程只有++,然后就等最里面的路由逻辑(也就是ping()方法)执行完后,next()方法也执行完了,就一层一层往外返回,就从最后的中间件开始倒着执行next()后面的代码回来呗~


还有的情况是,如果某个中间件不写c.next() ,就是循环里c.handlers[index](c)方法返回了,此时还有个c.index++等着的,就继续执行下一个handler去了

//这是某个中间件的执行方法
c.handlers[c.index](c)
//return后,依然有c.index++
c.index++

这应该就是老师说的return 后阻止不了后续执行代码的地方了。



以上是我自己看的源码自己理解的,如果有问题,请指正哈~






0

bobby

2021-06-04

c.next执行完成以后就继续从middleware中获取下一个待执行的逻辑执行

0

0 学习 · 1399 问题

查看课程