From 00b9c283d111d02b60da01339c174931fa7ea111 Mon Sep 17 00:00:00 2001 From: wjqserver <114663932+WJQSERVER@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:41:39 +0800 Subject: [PATCH] update chain exp --- midware_x.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/midware_x.go b/midware_x.go index 073a03c..645fb1d 100644 --- a/midware_x.go +++ b/midware_x.go @@ -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() + } +}