欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > golang 泛型 middleware 设计模式: 一次只做一件事

golang 泛型 middleware 设计模式: 一次只做一件事

2025/5/1 20:16:14 来源:https://blog.csdn.net/jarvan5/article/details/143665690  浏览:    关键词:golang 泛型 middleware 设计模式: 一次只做一件事

golang 泛型 middleware 设计模式: 一次只做一件事

1. 前言

本文主要介绍 在使用 gRPC 和 Gin 框架中常用的 middleware 设计模式

还有几种叫法

  1. 装饰器模式
  2. Pipeline 模式

设计思想:

  1. 10 个 10 行函数, 而不是 1 个 100 行函数
  2. 一次只做一件事, 而不一次做多件事
  3. 单一职责

2. 代码

已生产环境中大量使用, 每日执行千万次

package chaintype Ctx[T any] struct {in  T // 数据入参fns []func(c *Ctx[T], in T) (err error)idx int
}func NewCtx[T any](in T) *Ctx[T] {return &Ctx[T]{in:  in,idx: -1,}
}func (c *Ctx[T]) Next() (err error) {c.idx++for ; c.idx < len(c.fns); c.idx++ {err = c.fns[c.idx](c, c.in)if err != nil {return}}return
}func (c *Ctx[T]) Add(fns ...func(c *Ctx[T], in T) (err error)) {c.fns = append(c.fns, fns...)
}

3. test case

package chainimport ("fmt""testing""time"
)type Input struct {a int
}func TestNewCtx(t *testing.T) {// 初始化in := Input{a: 1}c := NewCtx(&in)// 添加中间件c.Add(ctx1_cost)    // 记录耗时c.Add(ctx2_add)     // 数据加工c.Add(ctx3_product) // 数据加工2// 执行err := c.Next()if err != nil {panic(err)}// 检查结果fmt.Println(in.a)if in.a != 4 {panic(fmt.Sprintf("expect 4, but got %d", in.a))}
}func ctx1_cost(c *Ctx[*Input], in *Input) (err error) {start := time.Now()defer func() {cost := time.Since(start)fmt.Println("cost:", cost)}()err = c.Next()return
}func ctx2_add(c *Ctx[*Input], in *Input) (err error) {in.a += 1return
}func ctx3_product(c *Ctx[*Input], in *Input) (err error) {in.a *= 2return
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词