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

在 Golang 中實現(xiàn)一個簡單的Http中間件過程詳解

 更新時間:2021年07月28日 16:47:46   作者:SpringLeee  
本文在go web中簡單的實現(xiàn)了中間件的機制,這樣帶來的好處也是顯而易見的,當然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關的功能,具體內(nèi)容詳情跟隨小編一起看看吧

本文主要針對Golang的內(nèi)置庫 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")
	})

}

這里中間件的入?yún)⒑统鰠⒌念愋投际?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)在已經(jīng)實現(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 對象并返回, 接下來調(diào)用 Then() 函數(shù), 把管道中的中間件和業(yè)務的Handler 關聯(lián)起來。在中間件的使用方式上, 這兩種方法都是一樣的,只需要調(diào)用 Pipeline() 方法就行了。

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

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

相關文章

  • Go中strings的常用方法詳解

    Go中strings的常用方法詳解

    這篇文章主要介紹了Go中strings的常用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • golang常用庫之gorilla/mux-http路由庫使用詳解

    golang常用庫之gorilla/mux-http路由庫使用詳解

    這篇文章主要介紹了golang常用庫之gorilla/mux-http路由庫使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • go?build失敗報方法undefined的解決過程

    go?build失敗報方法undefined的解決過程

    go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包,下面這篇文章主要給大家介紹了關于go?build失敗報方法undefined的解決過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Go工具鏈之go tool fix用法詳解

    Go工具鏈之go tool fix用法詳解

    go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正為新版本的代碼,本文將簡單介紹一下go tool fix的使用方法,感興趣的小伙伴可以參考閱讀下
    2023-07-07
  • Go設計模式之模板方法模式講解和代碼示例

    Go設計模式之模板方法模式講解和代碼示例

    模版方法是一種行為設計模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結構的情況下重寫算法的特定步驟,本文將通過代碼示例給大家詳細的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • Golang并發(fā)操作中常見的讀寫鎖詳析

    Golang并發(fā)操作中常見的讀寫鎖詳析

    Golang中的鎖機制主要包含互斥鎖和讀寫鎖互斥鎖互斥鎖是傳統(tǒng)并發(fā)程序對共享資源進行控制訪問的主要手段,這篇文章主要給大家介紹了關于Golang并發(fā)操作中常見的讀寫鎖的相關資料,需要的朋友可以參考下
    2021-08-08
  • Go設計模式之單例模式講解和代碼示例

    Go設計模式之單例模式講解和代碼示例

    單例是一種創(chuàng)建型設計模式,讓你能夠保證一個類只有一個實例,并提供一個訪問該實例的全局節(jié)點,本文就通過代碼示例給大家講講Go單例模式,需要的朋友可以參考下
    2023-07-07
  • Golang中map的深入探究

    Golang中map的深入探究

    Go中Map是一個KV對集合,下面這篇文章主要給大家介紹了關于Golang中map探究的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-09-09
  • go特性之數(shù)組與切片的問題

    go特性之數(shù)組與切片的問題

    這篇文章主要介紹了go特性之數(shù)組與切片的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 利用go語言實現(xiàn)查找二叉樹中的最大寬度

    利用go語言實現(xiàn)查找二叉樹中的最大寬度

    這篇文章主要介紹了利用go語言實現(xiàn)查找二叉樹中的最大寬度,文章圍繞主題展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論

新郑市| 大英县| 长治市| 崇礼县| 宁河县| 和政县| 白城市| 若羌县| 松潘县| 富裕县| 苍南县| 泽州县| 黄骅市| 宕昌县| 漾濞| 襄城县| 庄浪县| 墨玉县| 定南县| 南涧| 盘锦市| 大庆市| 吉木乃县| 乌兰察布市| 宣汉县| 高阳县| 东乡族自治县| 德庆县| 建德市| 页游| 湖口县| 栾川县| 五华县| 瓮安县| 页游| 鄂伦春自治旗| 景洪市| 西峡县| 潢川县| 马鞍山市| 东乌|