返回顶部
首页 > 资讯 > 后端开发 > GO >Golang的中间件设计模式怎么实现
  • 615
分享到

Golang的中间件设计模式怎么实现

2023-07-05 09:07:04 615人浏览 安东尼
摘要

这篇文章主要讲解了“golang的中间件设计模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang的中间件设计模式怎么实现”吧!Demo所以接下来我们就来看看demo吧 首先

这篇文章主要讲解了“golang中间件设计模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang的中间件设计模式怎么实现”吧!

Demo

所以接下来我们就来看看demo吧 首先先定义好中间件的类型,这里我就简单定义为以下的格式

type middleware func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error)
  • ctx: 协程间通信带着

  • req: 请求的格式,这里图简便,直接interface{}类型

  • resp: 同req

  • err: error

handler: endpoint类型,真正用来发起请求的一个处理方法或者是经过N层中间件包装的后的发起请求的处理方法

type endpoint func(ctx context.Context, req interface{}) (resp interface{}, err error)//ctx: 协程间通信带着 //req: 请求的格式,这里图简便,直接interface{}类型//resp: 同req  //err: error

然后既然我们要将上方的endpoint进行包装然后产生一个新的endpoint那么也就是需要一个函数去做一步的事情,input是endpoint,ouput也是endpoint

type warp func(endpoint) endpoint //就是这个warp函数

然后我们通过每次调用这个warp的定义去生成一个新的endpoint就可以产生一个类似于dfs链式调用的一个中间件的过程,因为将会一层套一层的endpoint下去,然后当最后一层有返回了以后就可以接着返回了,然后不断的弹栈回去最开始的地方,因为我们中间件的实现必然是要调用handler的

func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error) {fmt.Printf("before1\n")resp, err = handler(ctx, req)fmt.Printf("end1\n")return}

Golang的中间件设计模式怎么实现

// handler0var handler endpoint = func(ctx context.Context, req interface{}) (resp interface{}, err error) {fmt.Printf("make msg\n")return nil, nil} // middlewarevar md Middleware = func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error) {fmt.Printf("before1\n")resp, err = handler(ctx, req)fmt.Printf("end1\n")return}// warp ->> handler1handler = warp(func(e endpoint) endpoint {return func(ctx context.Context, req interface{}) (resp interface{}, err error) {return md(ctx, req, e)}})(handler)

验证结论

package mainimport ("context""fmt")type endpoint func(ctx context.Context, req interface{}) (resp interface{}, err error)type middleware func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error)type warp func(endpoint) endpointfunc main() {mds := []middleware{}mds = append(mds, func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error) {fmt.Printf("before1\n")resp, err = handler(ctx, req)fmt.Printf("end1\n")return})mds = append(mds, func(ctx context.Context, req interface{}, handler endpoint) (resp interface{}, err error) {fmt.Printf("before2\n")resp, err = handler(ctx, req)fmt.Printf("end2\n")return})var handler endpoint = func(ctx context.Context, req interface{}) (resp interface{}, err error) {fmt.Printf("make msg\n")return nil, nil}for i := len(mds) - 1; i >= 0; i-- {handler = warp(func(e endpoint) endpoint {// 由于go的机制问题如果不用tmp去存下当前的i,那么mds[i]就会取最终的那一个,就会溢出,所以在return前先保存一下i的量,然后每一个stack去存的变量就是对的cur := ireturn func(ctx context.Context, req interface{}) (resp interface{}, err error) {return mds[cur](ctx, req, e)}})(handler)}resp, err := handler(context.Background(), "ster")if resp != nil && err != nil {return}}

结果是

before1
before2
make msg
end2
end1

结论:感觉有函数指针的语言都可以用这一套去实现一个中间件

感谢各位的阅读,以上就是“Golang的中间件设计模式怎么实现”的内容了,经过本文的学习后,相信大家对Golang的中间件设计模式怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: Golang的中间件设计模式怎么实现

本文链接: https://lsjlt.com/news/350898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang的中间件设计模式怎么实现
    这篇文章主要讲解了“Golang的中间件设计模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang的中间件设计模式怎么实现”吧!Demo所以接下来我们就来看看demo吧 首先...
    99+
    2023-07-05
  • 一文详解Golang的中间件设计模式
    目录背景Demo验证结论背景 记录一下自己在go开发和学习上的一些笔记 最近在看一些rpc框架的使用原理和源码的时候,对中间件的实现非常感兴趣,然后也看了一下grpc的中间件的用法,...
    99+
    2023-03-06
    Golang中间件设计模式 Golang中间件 Go 中间件
  • Golang设计模式之外观模式的实现
    目录1. 模拟场景2. 代码实现2.1 Hero2.2 LiXin2.3 LiBai2.4 main3. 含义1. 模拟场景 实现需求为玩家拥有多个英雄,在部署好英雄之后,只用点击进...
    99+
    2023-05-20
    Go外观模式 Go设计模式外观模式
  • javascript设计模式中的策略模式怎么实现
    这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!一. 认识策略模式策略...
    99+
    2023-06-26
  • java设计模式中的门面模式怎么实现
    这篇文章主要介绍“java设计模式中的门面模式怎么实现”,在日常操作中,相信很多人在java设计模式中的门面模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的门面模式怎么实现”的疑...
    99+
    2023-06-29
  • Java设计模式中的命令模式怎么实现
    本文小编为大家详细介绍“Java设计模式中的命令模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式中的命令模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。个人理解:把一个类里的...
    99+
    2023-06-30
  • Python设计模式中命令模式怎么实现
    这篇文章主要介绍了Python设计模式中命令模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python设计模式中命令模式怎么实现文章都会有所收获,下面我们一起来看看吧。1.命令模式命令模式的目的是解...
    99+
    2023-06-29
  • javascript设计模式中的订阅者模式怎么实现
    本篇内容介绍了“javascript设计模式中的订阅者模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. 初识代理模式代理模式是...
    99+
    2023-06-26
  • JavaScript设计模式中的观察者模式怎么实现
    本文小编为大家详细介绍“JavaScript设计模式中的观察者模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript设计模式中的观察者模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-02
  • JavaScript的设计模式怎么实现
    这篇文章主要讲解了“JavaScript的设计模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的设计模式怎么实现”吧!1 设计...
    99+
    2024-04-02
  • PHP设计模式之中介者模式怎么实现
    这篇“PHP设计模式之中介者模式怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP设计模式之中介者模式怎么实现”文...
    99+
    2023-07-05
  • Java设计模式的工厂模式怎么实现
    本篇内容介绍了“Java设计模式的工厂模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!工厂模式在Java应用程序中对象无处不在,这...
    99+
    2023-06-29
  • javascript设计模式的命令模式怎么实现
    这篇文章主要介绍“javascript设计模式的命令模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式的命令模式怎么实现”文章能帮助大家解决问题。一. 认识命令模...
    99+
    2023-06-26
  • javascript设计模式的享元模式怎么实现
    这篇文章主要介绍“javascript设计模式的享元模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式的享元模式怎么实现”文章能帮助大家解决问题。一. 认识享元模...
    99+
    2023-06-26
  • Java设计模式的桥接模式怎么实现
    这篇文章主要讲解了“Java设计模式的桥接模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式的桥接模式怎么实现”吧!什么是桥接模式桥接(Bridge)模式的定义如下:...
    99+
    2023-06-30
  • Java设计模式的代理模式怎么实现
    这篇文章主要介绍了Java设计模式的代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。什么是代理模式代理模式的定义: 由于某...
    99+
    2023-06-30
  • golang不能实现的设计模式有哪些
    Golang 作为一种静态类型语言,相比其他动态语言可能会有一些限制,但它仍然可以实现大部分常见的设计模式。然而,有一些设计模式可能...
    99+
    2023-10-27
    golang
  • 怎么在Django中实现MVT设计模式
    怎么在Django中实现MVT设计模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。经典的MVC设计模式及其优点MVC即 Model-View-Controller(模型-...
    99+
    2023-06-14
  • 怎么用Java实现的设计模式
    这篇文章给大家分享的是有关怎么用Java实现的设计模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。abstract class AProductRam { public String getProdu...
    99+
    2023-06-03
  • Java设计模式的适配器模式怎么实现
    这篇文章主要介绍“Java设计模式的适配器模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java设计模式的适配器模式怎么实现”文章能帮助大家解决问题。什么是适配器模式适配器模式(Adap...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作