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

devtools/2024/11/14 0:52:35/

golang__middleware___1">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
}

http://www.ppmy.cn/devtools/133787.html

相关文章

基于Java+SpringBoot在线考试系统

一、作品包含 源码数据库设计文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&…

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具&#xff0c;也就意味着不需要再添加第三方依赖了&#xff0c;相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

Vagrant 没了 VirtualBox 的话可以配 Qemu

开源虚拟机软件 VirtualBox 从当初不可一世的 Sun 易手到 Oracle 之间&#xff0c;变得不那么被许多公司信任了。之前一直是用 Vagrant 搭配 VirtualBox 在 Mac 下使用 Linux 虚拟机&#xff0c;因为不需要用到 Linux 桌面&#xff0c;用 Vagrant 操作虚拟机非常方便。但现在不…

GitHub Org

运营一个GitHub Org&#xff08;组织&#xff09;是一个复杂但充满价值的过程&#xff0c;它涉及多个方面&#xff0c;包括项目管理、团队协作、代码审查、文档维护、社区建设等。以下是一篇关于如何运营GitHub Org的详细指南&#xff0c;旨在帮助组织者更好地管理和维护其GitH…

量化交易系统开发-实时行情自动化交易-3.4.2.1.Okex K线数据

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取K线数…

系统架构设计师论文:论基于构件的软件开发方法及其应用

从下列的4道试题(试题一至试题四) 中任选1道解答。请在答题纸上的指定位置处将所选择试题的题号框涂黑。若多涂或者未涂题号框,则对题号最小的一道试题进行评分。 试题一 论基于构件的软件开发方法及其应用 基于构作的软件开发 (Component-Based Software Development,CBSD…

第23天Linux下常用工具(二)

目录 第四章 GDB调试工具 4.1gdb的作用 4.2调试代码的流程 4.3gdb的安装 4.4 gdb的使用 第五章 makefile工程管理工具 5.1makefile的作用 5.2makefile的运行 5.3make的安装 5.4makefile的编写方法 5.5makefile的语法 5.6makefile使用示例 第四章 GDB调试工具 4.1g…