如何在Golang中使用职责链模式处理请求_顺序调用链上各处理器


Go中职责链模式通过接口/函数类型定义Handler,用组合构建链式结构,支持SetNext链式拼接,Handle中判空并按true终止、false传递,可函数式初始化。

在 Go 语言中实现职责链(Chain of Responsibility)模式,核心是让多个处理器(Handler)按顺序尝试处理请求,每个处理器决定是否处理、是否继续传递给下一个。Go 没有类继承,但可通过接口 + 组合 + 函数式风格优雅实现,且天然适合链式调用。

定义统一处理器接口

所有处理器需满足同一行为契约,通常是一个接受请求并返回是否“已处理”或继续传递的函数签名:

推荐方式:定义 Handler 接口,含 Handle(req interface{}) bool 方法。返回 true 表示已终结处理;false 表示交由下一环节。

更 Go 风格的变体:用函数类型代替接口,如 type HandlerFunc func(interface{}) bool,再为它实现 Handle 方法,便于链式组装。

构建可链式拼接的处理器结构

用结构体封装处理器逻辑,并持有下一个处理器引用(可为 nil),形成链表结构:

  • 定义 Chain 结构体,字段包含 next Handler 和业务逻辑字段(如校验规则、日志开关等)
  • 实现 SetNext(h Handler) *Chain 方法,支持链式调用:如 authHandler.SetNext(logHandler).SetNext(dbHandler)
  • Handle(req interface{}) bool 方法内先执行自身逻辑,若未终结,则调用 next.Handle(req)

避免空指针与提前终止

实际使用中容易忽略两个关键点:

  • Handle 方法中,必须判空 h.next != nil 再调用,否则 panic
  • 若某个处理器返回 true,表示请求已被消费,不应再调用后续处理器;若返回 false,才应继续传递
  • 可在链尾加一个默认处理器(如 DefaultHandler),确保所有请求都有兜底响应,避免无声丢失

用函数式写法简化链初始化

不依赖结构体字段,直接用闭包组合处理器,更轻量:

func NewChain(handlers ...HandlerFunc) HandlerFunc {
  return func(req interface{}) bool {
    for _, h := range handlers {
      if h(req) {
        return true
      }
    }
    return false // 全部未处理
  }
}

这样可直接:handler := NewChain(AuthCheck, RateLimit, LogRequest, SaveToDB),调用 handler(myReq) 即触发整条链。


# go  # golang  # 处理器  # ai  # if  # for  # 封装  # 结构体  # bool  # 指针  # 继承  # 接口  # Interface  # 闭包  # 空指针  # nil  # 链式  # 是一个  # 都有  # 多个  # 已被  # 下一  # 可在  # 不应  # 可直接  # 可通过 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php8.4匿名类怎么用_php8.4匿名类创建与使用场景【介绍】  如何在Golang中实现WebSocket广播_使用Channel和协程分发消息  Win11怎样安装钉钉客户端_Win11安装钉钉教程【步骤】  Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式  php怎么连接数据库_MySQL数据库连接的基础代码编写【说明】  Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】  php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】  如何使用Golang recover捕获panic_防止程序崩溃并处理异常  c++中如何使用auto关键字_c++11类型推导用法说明  php485函数怎么捕获异常_php485错误处理机制设置技巧【操作】  Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】  如何在Golang中处理通道发送接收错误_防止阻塞或panic  Go 语言标准库为何不提供泛型 Contains 方法?  php中::能访问全局变量吗_全局作用域与类作用域区分【操作】  如何在 Go 应用中实现自动错误恢复与进程重启机制  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Python大文件处理策略_内存优化说明【指导】  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  LINUX如何查看文件类型_Linux中file命令的识别与应用  如何在Golang中捕获结构体方法错误_Golang方法返回error处理实践  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  如何在Golang中理解指针比较_Golang地址比较与相等判断  PythonWeb前后端整合项目教程_FastAPIReact完整实例  Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】  Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】  Win11怎样安装企业微信_Win11安装企业微信教程【步骤】  php8.4如何配置ssl证书_php8.4https访问配置指南【教程】  如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例  MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  LINUX怎么设置系统语言_LINUX修改中文环境  Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】  如何使用Golang编写单元测试_创建Test函数验证业务逻辑  如何在 VS Code 中正确配置并使用 NumPy  Go语言中正确反序列化多个同级XML元素为结构体切片的方法  Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】  Windows10怎么用“讲述人”读屏辅助 Windows10轻松使用开启讲述人朗读屏幕文字帮助视障用户【教程】  Windows10如何更改日期格式_Win10区域设置短日期修改  Python字符串处理进阶_切片方法解析【指导】  Windows服务无法启动错误1067是什么_进程意外终止的解决方法  Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】  windows如何修改文件默认打开方式_windows设置程序关联教程  Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】 

 2025-12-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.