老师,按您图说的执行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()后面的逻辑吗?


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 后阻止不了后续执行代码的地方了。
以上是我自己看的源码自己理解的,如果有问题,请指正哈~
bobby
2021-06-04
c.next执行完成以后就继续从middleware中获取下一个待执行的逻辑执行
相似问题