Golang中的路由

2021-09-13 16:31:30 字數 2638 閱讀 9682

之前有篇文章比較淺顯的分析了一下golang的伺服器如何實現,還有handler,defaultservemux,handlerfunc的用處。

我們現在已經明白了defaultservemux就是存放patternhandler的地方,我們稱其為路由,那麼我們可能會想,既然golang能夠實現這個路由,我們能否也模仿乙個呢?

首先我們需要乙個能夠儲存客戶端的請求的乙個容器(路由)。

type copyrouter struct
在這裡我們建立了乙個像defaultservemux的路由。

}這裡我們模仿原始碼中的servemux將每乙個url所對應的handler儲存起來。

}在這裡為什麼要實現這個handler介面,因為我們發現在listenandserve方法中,最後會呼叫h.servehttp(w, r),那麼我們就只需要讓我們定義的路由實現handler介面就可以了。

func newrouter() *copyrouter
到這裡,我們自己定義的路由就完成了,我們來看看使用方法。

func main()這樣就完成了乙個高仿版的自定義路由,是不是和golang提供給我們的servemux很像,當然我們這個路由是乙個低配版的,還有很多細節沒有處理。

現在再看看,我們的main函式裡面的**不是很美觀,每一次都要寫get或者post方法,那麼我們能否提供乙個比較美觀的方式呢?可以,那麼我們再封裝一下。

...然後再修改一下呼叫方式。

copyrouter.get("/sayhi",sayhi)
現在看起來是不是就美觀很多了?是的,很多web框架也是這樣,為什麼用起來就感覺很流暢,因為這些大神們就是站在我們開發者的角度來考慮問題,提供了很方便的一些用法,封裝的很完善。

再考慮一下,我們這個自定義的路由還能做些什麼,如果我們要記錄每一次的訪問請求,該如何處理呢?也很簡單,我們只需要將邏輯寫在servehttp方法中就可以了,稍微修改一下我們的**。

}}這裡我們又加入了乙個記錄請求時間的功能,所以在這個自定義的路由裡面還可以做更多的事情。

還有一點,就是我們在定義這個路由結構體的時候,能否將這個型別修改為handler呢?也就是將這個型別map[string]map[string]http.handlerfunc修改為map[string]map[string]http.handler,是可以的,但是我們在呼叫的時候就需要在main方法裡面做一下修改。

copyrouter.get("/sayhi",handlerfunc(sayhi))
在這裡做乙個強制轉換即可,但是這樣也不是很美觀。

看到這裡,我們應該對乙個原始碼中的型別重點關注一下,那就是handlerfunc

type handlerfunc func(responsewriter, *request)

func (f handlerfunc) servehttp(w responsewriter, r *request)

這裡handlerfunc起到了乙個介面卡的作用,這是乙個非常巧妙的設計,不得不說golang在介面這方面確實設計的很精妙。

golang中的陣列

陣列含義 同一種資料型別元素的集合,陣列的成員可以修改,但是不能追加跟刪除,大小不可以變化 陣列的定義 var 陣列名 元素數量 t陣列的訪問 通過下標進行訪問,下標從0開始,最後乙個元素是len 陣列名 1 注意 訪問不能越界,越界會panic 陣列的遍歷 package main import ...

golang中的type轉換

大家都知道,golang中可以這樣定義乙個型別 type powerstring string 這種不是物件導向中的繼承,但有點像,因為powerstring能得到string的屬性方法等。我們給powerstring寫個方法 func ps powerstring print 那怎麼新建乙個pow...

Golang中的訊號處理

個平台的訊號定義或許有些不同。下面列出了posix中定義的訊號。linux 使用34 64訊號用作實時系統中。命令man 7 signal提供了官方的訊號介紹。在posix.1 1990標準中定義的訊號列表訊號值 動作說明 sighup 1term 終端控制程序結束 終端連線斷開 sigint 2t...