新闻中心

如何使用Golang实现责任链模式_使用Chain of Responsibility处理请求链

2025-12-13
浏览次数:
返回列表
Go中责任链模式通过HandlerFunc函数类型和Chain结构实现,以组合代替继承,支持日志、鉴权等Handler链式包装与动态中断。

如何使用golang实现责任链模式_使用chain of responsibility处理请求链

用 Go 实现责任链模式,核心是让多个处理器(Handler)按顺序尝试处理请求,每个 Handler 决定是否处理、是否继续传递。Go 没有继承机制,但靠接口 + 组合 + 函数式风格能更轻量、更灵活地实现它。

定义统一的处理器接口

所有 Handler 都要实现同一个行为:接收请求、返回响应或错误,并决定是否把请求传给下一个 Handler。

推荐用函数类型代替接口,更简洁:

type HandlerFunc func(req interface{}) (resp interface{}, err error)

再封装一个链式调用结构:

type Chain struct { handlers []HandlerFunc }

构建可串联的 Handler 链

每个 Handler 只关心自己的逻辑,处理完后手动调用 next(如果存在)——这比“强制继承 BaseHandler”更符合 Go 的组合哲学。

例如写一个日志 Handler 和一个鉴权 Handler:

拾贝 拾贝

一键同步微信读书所有笔记和划线,并在新标签页回顾

拾贝 186 查看详情 拾贝 func LoggingHandler(next HandlerFunc) HandlerFunc {
  return func(req interface{}) (interface{}, error) {
    log.Println("→ request received:", req)
    resp, err := next(req)
    log.Println("← response sent:", resp)
    return resp, err
  }
}
func AuthHandler(next HandlerFunc) HandlerFunc {
  return func(req interface{}) (interface{}, error) {
    if user, ok := req.(map[string]interface{})["user"]; !ok || user == nil {
      return nil, errors.New("unauthorized")
    }
    return next(req)
  }
}

组装与执行链

链的组装建议从后往前(类似中间件),让最内层 Handler 先定义,再逐层包装:

  • 先写业务 Handler(比如处理支付逻辑)
  • 用 AuthHandler 包一层
  • 再用 LoggingHandler 包一层
  • 最后调用顶层 Handler 处理请求

示例:

payHandler := func(req interface{}) (interface{}, error) {
  return map[string]string{"status": "paid"}, nil
}

chain := LoggingHandler(AuthHandler(payHandler))
resp, err := chain(map[string]interface{}{"user": "alice", "amount": 100})

支持动态插拔与中断

如果需要运行时增删 Handler,可用切片维护 handler 列表,配合 for 循环+break 实现中断:

func (c *Chain) Serve(req interface{}) (interface{}, error) {
  for _, h := range c.handlers {
    if resp, err := h(req); err != nil {
      return resp, err // 中断链
    } else if resp != nil {
      return resp, nil // 显式返回,不继续
    }
  }
  return nil, errors.New("no handler processed the request")
}

这样既保留控制权,又避免隐式跳转,调试也更直观。

基本上就这些。Go 里责任链不靠类继承,而靠函数包装和显式调用,反而更可控、易测试、无耦合。

以上就是如何使用Golang实现责任链模式_使用Chain of Responsibility处理请求链的详细内容,更多请关注其它相关文章!


# 多个  # 惠州企业seo服务  # 昌邑seo优化排名  # 龙翔谷生态园网站建设  # 企业网站推广的效果评估  # 开州可靠网站建设  # 汝南百度网络推广营销  # 辽宁营销网站建设预算  # 苏州靠谱软文营销推广  # 推广宣传公司网站  # 家电网站推广怎么做  # 并在  # go  # 都要  # 大文件  # 自己的  # 图像处理  # 中文网  # 如何使用  # 拾贝  # 链式  # ai  # 处理器  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11怎么开启高性能模式_Windows 11电源计划优化设置  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  快手极速版在线观看 官方网页版登录地址  海量存储:机器视觉智能化的核心基石  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  Go Martini框架:动态服务解码后的图片内容  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  DLsite中文平台入口 DLsite官网内容在线查看  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  Typer应用中动态命令行参数的解析与处理  PHP URL参数传递与500错误调试指南  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  steam官方入口大全 steam账号注册及操作指南  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  excel如何生成目录 excel一键生成工作表目录超链接  海棠电脑版入口_通过电脑访问海棠官网阅读  Python自定义类排序:解决lambda键值访问TypeError的实践指南  PySpark中从现有列右侧提取可变长度字符创建新列的教程  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  163邮箱登录密码 163邮箱忘记密码找回  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  千牛数据看板网页版_千牛数据看板网页版访问方法  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  AO3中文官网链接_AO3网页版稳定镜像站  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  58动漫网在线官方网 58动漫网正版动漫入口网址  AI泡沫首次被“刺破”:GPU十年都无法存活!  解决Tabulator日期时间排序问题的专业指南  qq游戏免费畅玩入口_qq游戏电脑版快速启动  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  理解Python模块与全局变量的作用域管理  BetterDiscord插件中安全更新用户简介的实践指南  如何有效阻止外部脚本意外修改内联样式的高度属性  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  快手网页版在线登录 快手网页版官网入口快速访问  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  AO3同人作品网入口 AO3搜索引擎官网永久地址  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法 

搜索