之前有篇文章比較淺顯的分析了一下golang的伺服器如何實現,還有handler
,defaultservemux
,handlerfunc
的用處。
我們現在已經明白了defaultservemux
就是存放pattern
和handler
的地方,我們稱其為路由
,那麼我們可能會想,既然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...