如何使用Golang实现责任链模式_处理请求的链式传递

24次阅读

责任链模式在go中通过接口定义处理器、链式组装和延迟执行自然实现,核心是每个处理器自主决定是否处理请求及是否传递给下一个处理器;所有处理器实现统一Handler接口,结构体持有next引用,支持拦截与透传,可配合函数式构造器提升链式构建体验。

如何使用Golang实现责任链模式_处理请求的链式传递

责任链模式在 Go 中可以通过接口定义处理器、链式组装和延迟执行来自然实现,核心是让每个处理器决定是否处理请求,以及是否将请求传递给下一个处理器。

定义统一的处理器接口

所有处理器都实现同一个接口,确保链中任意环节可被替换或扩展:

type Handler interface {     Handle(request interface{}) (interface{}, error) }

该接口接收任意请求,返回响应或错误。不强制要求每个处理器都必须调用下一个——是否传递由当前处理器逻辑决定,这是责任链的关键灵活性。

构建可链接的处理器结构

用结构体包装具体逻辑,并持有下一个处理器引用(可为空):

立即学习go语言免费学习笔记(深入)”;

如何使用Golang实现责任链模式_处理请求的链式传递

模力视频

模力视频 – aiGC视频制作平台 | AI剪辑 | 云剪辑 | 海量模板

如何使用Golang实现责任链模式_处理请求的链式传递 425

查看详情 如何使用Golang实现责任链模式_处理请求的链式传递

type AuthHandler struct {     next Handler }  func (h *AuthHandler) Handle(request interface{}) (interface{}, error) {     // 假设 request 是 map[string]interface{}     if token, ok := request.(map[string]interface{})["token"]; !ok || token == nil {         return nil, fmt.Errorf("missing auth token")     }     // 验证通过,继续传递     if h.next != nil {         return h.next.Handle(request)     }     return "auth passed", nil }  func (h *AuthHandler) SetNext(next Handler) {     h.next = next }

类似地可实现 RateLimitHandlerValidationHandler 等,每个只关注单一职责。

链式组装与运行

按需串联处理器,顺序即执行顺序:

auth := &AuthHandler{} rate := &RateLimitHandler{} valid := &ValidationHandler{} log := &LoggingHandler{}  // 从头到尾链接 auth.SetNext(rate) rate.SetNext(valid) valid.SetNext(log)  // 启动链式处理 resp, err := auth.Handle(map[string]interface{}{     "token": "abc123",     "data":  "hello", }) if err != nil {     log.Fatal(err) } fmt.Println(resp) // 输出最终响应

  • 链的起点是第一个调用 Handle 的处理器
  • 任一环节返回非 nil 错误,通常可直接中断链(也可设计为“异常透传”或“兜底处理”)
  • 若某个处理器不调用 next.Handle(),链即终止,适合做拦截型逻辑(如拒绝非法请求)

增强灵活性:使用函数式构造器

避免手动 SetNext,改用链式构造语法,更符合 Go 的简洁风格:

type Chain struct {     first Handler }  func NewChain(h Handler) *Chain {     return &Chain{first: h} }  func (c *Chain) Then(h Handler) *Chain {     if c.first != nil {         // 递归找到末尾并链接         last := c.findLast(c.first)         last.SetNext(h)     }     return c }  func (c *Chain) findLast(h Handler) Handler {     if nexter, ok := h.(interface{ GetNext() Handler }); ok {         if n := nexter.GetNext(); n != nil {             return c.findLast(n)         }     }     return h }  // 使用方式 chain := NewChain(&AuthHandler{}).     Then(&RateLimitHandler{}).     Then(&ValidationHandler{}).     Then(&LoggingHandler{})  resp, err := chain.first.Handle(req)

也可进一步封装Run(request) 方法,隐藏 first 调用细节,使 API 更干净。

text=ZqhQzanResources