欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang利用函數(shù)閉包實現(xiàn)簡單的中間件

 更新時間:2023年10月08日 08:37:10   作者:言志志  
中間件設計模式是一種常見的軟件設計模式,它在許多編程語言和框架中被廣泛應用,這篇文章主要為大家介紹一下golang利用函數(shù)閉包實現(xiàn)一個簡單的中間件,感興趣的可以了解下

什么叫做中間件

中間件設計模式是一種常見的軟件設計模式,它在許多編程語言和框架中被廣泛應用,包括Go、Node.js、Python等。

中間件模式的核心思想是將一系列的處理邏輯組合在一起,形成一個處理鏈(或稱為管道),每個處理邏輯被封裝成一個中間件函數(shù)。每個中間件函數(shù)可以在請求處理的不同階段添加額外的功能或邏輯,而無需修改原始的處理函數(shù)。

中間件模式的優(yōu)勢在于它提供了一種可插拔、可組合的方式來擴展和定制請求處理過程。以下是中間件模式的一些關鍵特點:

  • 可插拔性(Pluggability):中間件模式允許將中間件函數(shù)插入到處理鏈中,以添加新的功能或邏輯。這種可插拔性使得我們可以根據(jù)需要動態(tài)地添加、移除或替換中間件,而無需修改原始的處理函數(shù)。
  • 復用性(Reusability):中間件模式可以將通用的功能或邏輯封裝成可復用的中間件函數(shù)。這些中間件函數(shù)可以在不同的請求處理中重復使用,提高了代碼的復用性。
  • 可組合性(Composability):中間件模式允許將多個中間件函數(shù)按照特定的順序組合在一起,形成一個處理鏈。每個中間件函數(shù)可以在調用原始處理函數(shù)之前、之后或兩者之間執(zhí)行自己的邏輯。這種可組合性使得我們可以構建復雜的處理邏輯,將各個中間件函數(shù)按需組合,形成一個完整的請求處理流程。
  • 責任鏈(Chain of Responsibility):中間件模式的處理鏈形成了一個責任鏈結構,每個中間件函數(shù)都有機會處理請求或將處理傳遞給下一個中間件。這種責任鏈結構可以根據(jù)實際需求動態(tài)調整中間件的順序,實現(xiàn)不同的處理流程。

中間件模式在Web開發(fā)中得到了廣泛應用,特別是在處理HTTP請求的過程中。常見的中間件功能包括身份驗證、日志記錄、請求解析、緩存、錯誤處理、壓縮等。通過將這些功能封裝成中間件函數(shù),并按照需要組合起來,我們可以輕松地構建靈活、可擴展的Web應用程序。

利用函數(shù)閉包實現(xiàn)一個簡單的中間件

下面我以求兩數(shù)之和為例,實現(xiàn)一個簡單的中間件,可以看如下代碼

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("日志中間件,記錄操作數(shù): 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)
}

上面的代碼,可以被認為是一個中間件函數(shù)的實現(xiàn),我們在sum函數(shù)執(zhí)行之前,先進行了日志的記錄,并且又不影響原函數(shù)的執(zhí)行,就像添加了一個過程一樣,這個中間件函數(shù)可以被插入到處理鏈中,在執(zhí)行原始函數(shù)之前記錄操作數(shù)的日志,其實你可以發(fā)現(xiàn),我不過就是相當于將傳入的函數(shù)進行封裝了一下

當然,我們還可以更加優(yōu)雅,那就是抽象為一個函數(shù)類型,并且我們可以發(fā)現(xiàn),Zh中間件處理后的返回值,還可以繼續(xù)被它處理。

// 優(yōu)雅地處理
type F func(func(a, b int) int

對了,上面的函數(shù)是利用閉包實現(xiàn)的,首先閉包是指函數(shù)內部定義的函數(shù)可以訪問其外部函數(shù)的變量。

而在這個例子中,匿名函數(shù)func(a, b int) int是在Zh函數(shù)內部定義的,并且可以訪問外部函數(shù)的參數(shù)f。

具體來說,Zh函數(shù)接受一個函數(shù)類型的參數(shù)f,并返回一個具有相同函數(shù)簽名的函數(shù)。在返回的函數(shù)內部,它使用了log.Printf打印日志,并調用了外部函數(shù)的參數(shù)f。

由于返回的函數(shù)是在Zh函數(shù)內部定義的,它可以訪問Zh函數(shù)的參數(shù)f,即使Zh函數(shù)已經執(zhí)行完畢并返回了。這是因為閉包函數(shù)捕獲了其外部函數(shù)的變量,形成了一個閉包環(huán)境,使得返回的函數(shù)仍然可以訪問外部函數(shù)的變量。

當然,我只是想通過這個簡單的樣例讓你知道,什么是中間件

像go中的gin框架中的中間件的使用就很成熟,gin巧妙的把具體實現(xiàn)過程進行了隱藏,讓你只要寫好一個函數(shù),然后插入使用即可,非常優(yōu)雅,而本文的樣例,其實是把隱藏的過程進行了展示,詳情請看gin的源碼。

到此這篇關于golang利用函數(shù)閉包實現(xiàn)簡單的中間件的文章就介紹到這了,更多相關go中間件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入解析Go template模板使用詳解

    深入解析Go template模板使用詳解

    這篇文章主要介紹了深入解析Go template模板使用詳解,需要的朋友可以參考下
    2022-04-04
  • golang讀取yaml文件的示例代碼

    golang讀取yaml文件的示例代碼

    本文主要介紹了golang讀取yaml文件的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • Go語言應該什么情況使用指針

    Go語言應該什么情況使用指針

    go語言的指針類型和C/C++的指針類型用法是一樣的,那么Go語言應該什么情況使用指針,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-07-07
  • Go語言中的通道channel詳情

    Go語言中的通道channel詳情

    這篇文章主要介紹了Go語言中的通道channel,在Go語言中管道類似于一個數(shù)據(jù)流,每次放入或者取出一部分數(shù)據(jù),數(shù)據(jù)取出后原通道內的數(shù)據(jù)就刪除掉,在linux操作系統(tǒng)中管道會將函數(shù)的返回結果作為下一個函數(shù)的參數(shù),下文詳細內容需要的朋友可以參考下
    2022-02-02
  • 關于golang類型推斷和變量重聲明詳解

    關于golang類型推斷和變量重聲明詳解

    在Go語言中,類型推斷可以根據(jù)變量的初始化值自動推斷出變量的類型,而不需要顯式地聲明變量類型,變量重聲明可以在同一作用域內重復聲明一個變量,只要其中至少一個是新的變量,本就簡單的給大家介紹一下golang類型推斷和變量重聲明,需要的朋友可以參考下
    2023-08-08
  • 如何在Golang中運行JavaScript

    如何在Golang中運行JavaScript

    最近寫一個程序,接口返回的數(shù)據(jù)是js格式的,需要通過golang來解析js,所以下面這篇文章主要給大家介紹了關于如何在Golang中運行JavaScript的相關資料,需要的朋友可以參考下
    2022-01-01
  • 簡單聊聊Go語言里面的閉包

    簡單聊聊Go語言里面的閉包

    這篇文章主要為大家詳細介紹了Go語言中閉包的原理與實現(xiàn)的相關資料,文中的示例代碼講解詳細,對我們學習Go語言有一定幫助,需要的可以參考一下
    2022-11-11
  • Go語言中匿名嵌套和類型嵌套的區(qū)別解析

    Go語言中匿名嵌套和類型嵌套的區(qū)別解析

    在Go語言中,匿名嵌套結構體和與類型同名的嵌套結構體不是完全等價的,它們有一些重要的區(qū)別,這篇文章主要介紹了Go語言中匿名嵌套和類型嵌套的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 如何在Go語言中高效使用Redis的Pipeline

    如何在Go語言中高效使用Redis的Pipeline

    在 Redis 中,Pipeline 就像一條流水線,它允許我們將多個命令一次性發(fā)送到服務器,下面我們就來看看如何在Go語言中高效使用Redis的Pipeline吧
    2024-11-11
  • go實現(xiàn)Redis讀寫分離示例詳解

    go實現(xiàn)Redis讀寫分離示例詳解

    本篇文章將介紹Redis通信協(xié)議RESP,?而后在使用go來編寫一個中間件,從而來完成Redis讀寫分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論