update chain exp

This commit is contained in:
wjqserver 2025-06-17 14:41:39 +08:00
parent 21d048b5ab
commit 00b9c283d1

View file

@ -49,3 +49,41 @@ func (engine *Engine) UseIf(condition bool, middlewares HandlerFunc) HandlerFunc
return middlewares
}
func (engine *Engine) UseNewChainIf(condition bool, middlewares ...HandlerFunc) HandlerFunc {
// 如果条件不满足或没有提供中间件,返回一个“穿透”中间件。
if !condition || len(middlewares) == 0 {
return func(c *Context) {
c.Next()
}
}
// 如果条件满足,返回一个处理器,该处理器负责按顺序执行这个子链。
return func(c *Context) {
// 保存原始的处理链和当前执行索引,以便在子链结束后恢复。
originalHandlers := c.handlers
originalIndex := c.index
// 创建一个新的临时处理链。
// 这个链由传入的 `middlewares` 和一个特殊的“恢复”处理器组成。
subChain := make(HandlersChain, len(middlewares)+1)
copy(subChain, middlewares)
// 在子链的末尾添加“恢复”处理器。
// 当所有 `middlewares` 都执行完毕并调用了 Next() 后,这个函数会被执行。
subChain[len(middlewares)] = func(ctx *Context) {
// 恢复原始的处理链状态。
ctx.handlers = originalHandlers
ctx.index = originalIndex
// 继续执行原始处理链中 `ChainIf` 之后的下一个处理器。
ctx.Next()
}
// 将 Context 的处理器链临时替换为我们的子链,并重置索引以从头开始。
c.handlers = subChain
c.index = -1
// 调用 c.Next() 来启动这个子链的执行。
c.Next()
}
}