本文是探讨的是"go语言中的中间件
"
此文章是个人学习归纳的心得, 如有不对, 还望指正, 感谢!
为了判断你是否有阅读本文的必要,请你在脑海中快速实现一个中间件的代码结构?
中间件设计模式是一种常见的软件设计模式,它在许多编程语言和框架中被广泛应用,包括Go、Node.js、Python等。
中间件模式的核心思想是将一系列的处理逻辑组合在一起,形成一个处理链(或称为管道),每个处理逻辑被封装成一个中间件函数。每个中间件函数可以在请求处理的不同阶段添加额外的功能或逻辑,而无需修改原始的处理函数。
中间件模式的优势在于它提供了一种可插拔、可组合的方式来扩展和定制请求处理过程。以下是中间件模式的一些关键特点:
中间件模式在Web开发中得到了广泛应用,特别是在处理HTTP请求的过程中。常见的中间件功能包括身份验证、日志记录、请求解析、缓存、错误处理、压缩等。通过将这些功能封装成中间件函数,并按照需要组合起来,我们可以轻松地构建灵活、可扩展的Web应用程序。
下面我以求两数之和为例,实现一个简单的中间件,可以看如下代码
package main
import "log"
func sum(a, b int) int {
return a + b
}
func Zh(f func(a, b int) int) func(a, b int) int {
return func(a, b int) int {
log.Printf("日志中间件,记录操作数: a: %d b: %d\n", a, b)
return f(a, b)
}
}
func main(){
addWithLogging := Zh(sum)
result := addWithLogging(2, 3)
result2 := addWithLogging(5, 6)
fmt.Println(result,result2)
}
上面的代码,可以被认为是一个中间件函数的实现,我们在sum
函数执行之前,先进行了日志的记录,并且又不影响原函数的执行,就像添加了一个过程一样,这个中间件函数可以被插入到处理链中,在执行原始函数之前记录操作数的日志,其实你可以发现,我不过就是相当于将传入的函数进行封装了一下
当然,我们还可以更加优雅,那就是抽象为一个函数类型,并且我们可以发现,Zh
中间件处理后的返回值,还可以继续被它处理。
// 优雅地处理
type F func(func(a, b int) int
对了,上面的函数是利用闭包实现的,首先闭包是指函数内部定义的函数可以访问其外部函数的变量。
而在这个例子中,匿名函数func(a, b int) int
是在Zh
函数内部定义的,并且可以访问外部函数的参数f
。
具体来说,Zh
函数接受一个函数类型的参数f
,并返回一个具有相同函数签名的函数。在返回的函数内部,它使用了log.Printf
打印日志,并调用了外部函数的参数f
。
由于返回的函数是在Zh
函数内部定义的,它可以访问Zh
函数的参数f
,即使Zh
函数已经执行完毕并返回了。这是因为闭包函数捕获了其外部函数的变量,形成了一个闭包环境,使得返回的函数仍然可以访问外部函数的变量。
当然,我只是想通过这个简单的样例让你知道,什么是中间件
像go中的gin框架中的中间件的使用就很成熟,gin巧妙的把具体实现过程进行了隐藏,让你只要写好一个函数,然后插入使用即可,非常优雅,而本文的样例,其实是把隐藏的过程进行了展示,详情请看gin的源码。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。