最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中實現(xiàn)簡單的Http Middleware

 更新時間:2021年07月29日 10:08:36   作者:SpringLeee  
本文主要針對Golang的內置庫 net/http 做了簡單的擴展,實現(xiàn)簡單的Http Middleware,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文主要針對Golang的內置庫 net/http 做了簡單的擴展,通過添加中間件的形式實現(xiàn)了管道(Pipeline)模式,這樣的好處是各模塊之間是低耦合的,符合單一職責原則,可以很靈活的通過中間件的形式添加一些功能到管道中,一次請求和響應在管道中的執(zhí)行過程如下

首先, 我定義了三個測試的中間件 Middleware1,2,3 如下

func Middleware1(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M1 in")
		next.ServeHTTP(w, r)
		fmt.Println("M1 out")
	})

}

func Middleware2(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M2 in")
		next.ServeHTTP(w, r)
		fmt.Println("M2 out")
	})

}

func Middleware3(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M3 in")
		next.ServeHTTP(w, r)
		fmt.Println("M3 out")
	})

}

這里中間件的入參和出參的類型都是 http.Handler, 然后在 next.ServeHTTP() 的前后分別輸出了 In 和 Out.

接下來,定義一個 Pipeline 的方法,里面使用嵌套的形式, 使用了上面定義的三個測試的中間件.

func Pipeline(next http.Handler) http.Handler {

	return Middleware1(Middleware2(Middleware3(next)))

}

然后還需要業(yè)務代碼,這里我定義了 LoginHandler 和 RegisterHandler 兩個方法

func LoginHandler(w http.ResponseWriter, r *http.Request) {

	fmt.Println("Login...")
	w.Write([]byte("Login..."))

}

func RegisterHandler(w http.ResponseWriter, r *http.Request) {

	fmt.Println("Register...")
	w.Write([]byte("Register..."))

}

最后修改程序的 main 函數(shù), 在 Login 接口上使用上面添加過中間件的 Pipeline

func main() {

	http.Handle("/Login", Pipeline(http.HandlerFunc(LoginHandler)))

	http.Handle("/Register", http.HandlerFunc(RegisterHandler))

	http.ListenAndServe(":8080", nil)

}

啟動程序后,訪問 http://localhost:8080/Login, 程序的輸出如下,這和本文最上面的管道的流程圖是一致的,然后訪問 Register 接口, 控制臺沒有輸出信息,當然也不會執(zhí)行任何中間件。

現(xiàn)在已經實現(xiàn)了中間件的機制,但是,上面添加中間件是用嵌套的方法,這種方式不能說不太優(yōu)雅,只能說非常的Low,接下來我們需要對管道進行優(yōu)化

type Chain struct {
	middlewares []func(handler http.Handler) http.Handler
}


func Pipeline(next http.Handler) http.Handler {

	//return Middleware1(Middleware2(Middleware3(next)))

	return AddMiddlewares(Middleware1,Middleware2,Middleware3).Then(next)

} 


func AddMiddlewares(m ...func(handlerFunc http.Handler) http.Handler) Chain {

	c := Chain{}

	c.middlewares = append(c.middlewares,m...)

	return c

}


func (c Chain) Then(next http.Handler) http.Handler {

	for i := range c.middlewares {

		prev := c.middlewares[len(c.middlewares)-1-i]

		next = prev(next)
	}

	return next
} 

首先定義了一個Chain 的struct,用來接收添加到管道中的中間件,在 AddMiddlewares() 函數(shù)中,接收了多個Handle, 然后組裝到 Chain 對象并返回, 接下來調用 Then() 函數(shù), 把管道中的中間件和業(yè)務的Handler 關聯(lián)起來。在中間件的使用方式上, 這兩種方法都是一樣的,只需要調用 Pipeline() 方法就行了。

本文在go web中簡單的實現(xiàn)了中間件的機制,這樣帶來的好處也是顯而易見的,當然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關的功能, 希望對您有用.

到此這篇關于Golang中實現(xiàn)簡單的Http Middleware的文章就介紹到這了,更多相關Golang實現(xiàn)Http Middleware內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言實現(xiàn)新春祝福二維碼的生成

    Go語言實現(xiàn)新春祝福二維碼的生成

    二維碼現(xiàn)在是隨處度可以看到,買東西,支付,添加好友只要你掃一掃就能完成整個工作,簡單且方便。所以利用這個新春佳節(jié)做一個帶著新春祝福的二維碼吧
    2023-02-02
  • 詳解Golang中interface接口的原理和使用技巧

    詳解Golang中interface接口的原理和使用技巧

    interface?接口在?Go?語言里面的地位非常重要,是一個非常重要的數(shù)據(jù)結構。本文主要介紹了Golang中interface接口的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • golang中struct和interface的基礎使用教程

    golang中struct和interface的基礎使用教程

    Go不同于一般的面向對象語言,需要我們好好的學習研究,下面這篇文章主要給大家介紹了關于golang中struct和interface的基礎使用的相關資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2018-03-03
  • Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務

    Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務

    本文主要介紹了Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang1.21泛型函數(shù)全面講解

    golang1.21泛型函數(shù)全面講解

    在Go編程語言中,泛型一直是一個備受期待的特性,隨著Go?1.21的發(fā)布,本文旨在提供Go?1.21中泛型的詳細探索,闡明它們的優(yōu)點、語法、實現(xiàn)和最佳實踐,希望對大家有所幫助
    2023-09-09
  • Go語言時間處理必備技巧全解析

    Go語言時間處理必備技巧全解析

    Golang 的時間處理是 Golang 編程中的一個重要方面,它涉及到了時間類型、時間格式化、時間計算、時區(qū)處理以及定時器和超時機制等多個方面。在本文中,我們將從更深入的角度來探討 Golang 的時間處理
    2023-04-04
  • Golang實踐指南之獲取目錄文件列表

    Golang實踐指南之獲取目錄文件列表

    在搭建項目中一般都會有確定項目根目錄的絕對路徑的需求,下面這篇文章主要給大家介紹了關于Golang實踐指南之獲取目錄文件列表的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • golang基礎之waitgroup用法以及使用要點

    golang基礎之waitgroup用法以及使用要點

    WaitGroup是Golang并發(fā)的兩種方式之一,一個是Channel,另一個是WaitGroup,下面這篇文章主要給大家介紹了關于golang基礎之waitgroup用法以及使用要點的相關資料,需要的朋友可以參考下
    2023-01-01
  • go項目實現(xiàn)mysql接入及web?api的操作方法

    go項目實現(xiàn)mysql接入及web?api的操作方法

    這篇文章主要介紹了go項目實現(xiàn)mysql接入以及web api,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Golang?WorkerPool線程池并發(fā)模式示例詳解

    Golang?WorkerPool線程池并發(fā)模式示例詳解

    這篇文章主要為大家介紹了Golang?WorkerPool線程池并發(fā)模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論

津南区| 城固县| 峨边| 大方县| 泰来县| 南乐县| 山丹县| 兴和县| 长葛市| 隆尧县| 合阳县| 普格县| 乳源| 界首市| 伊金霍洛旗| 当雄县| 南昌县| 西畴县| 怀仁县| 巍山| 丰宁| 凭祥市| 手游| 永靖县| 岗巴县| 澳门| 宁强县| 长春市| 五河县| 乐亭县| 黄冈市| 岱山县| 巫溪县| 弥渡县| 山阳县| 防城港市| 沂源县| 泽州县| 宁化县| 上杭县| 年辖:市辖区|