亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang中的路由使用詳解

2020-04-01 18:56:46
字體:
來源:轉載
供稿:網友

之前有篇文章比較淺顯的分析了一下golang的服務器如何實現,還有Handler, DefaultServeMux,HandlerFunc的用處。

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

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

創建路由結構體

type CopyRouter struct {  router map[string]map[string]http.HandlerFunc}

在這里我們創建了一個像DefaultServeMux的路由。

客戶端請求存入路由

func (c *CopyRouter) HandleFunc(method, pattern string, handle http.HandlerFunc) {  if method == "" {    panic("Method can not be null!")  }  if pattern == "" {    panic("Pattern can not be null!")  }  if _, ok := c.router[method][pattern]; ok {    panic("Pattern Exists!")  }  if c.router == nil {    c.router = make(map[string]map[string]http.HandlerFunc)  }  if c.router[method] == nil {    c.router[method] = make(map[string]http.HandlerFunc)  }  c.router[method][pattern] = handle}

這里我們模仿源碼中的ServeMux將每一個URL所對應的handler保存起來。

實現Handler接口

func (c *CopyRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {  if f, ok := c.router[r.Method][r.URL.String()]; ok {    f.ServeHTTP(w, r)  }}

在這里為什么要實現這個Handler接口,因為我們發現在ListenAndServe方法中,最后會調用h.ServeHTTP(w, r),那么我們就只需要讓我們定義的路由實現Handler接口就可以了。

獲取一個路由

func NewRouter() *CopyRouter {  return new(CopyRouter)}

到這里,我們自己定義的路由就完成了,我們來看看使用方法。

func sayHi(w http.ResponseWriter, r *http.Request) {  fmt.Fprint(w,"Hi")}func main() {  copyRouter := copyrouter.NewRouter()  copyRouter.HandleFunc("GET","/sayHi", sayHi)  log.Fatal(http.ListenAndServe("localhost:8080", copyRouter))}

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

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

func (c *CopyRouter) GET(pattern string, handler http.HandlerFunc){  c.HandleFunc("GET", pattern, handler)}func (c *CopyRouter) POST(pattern string, handler http.HandlerFunc){  c.HandleFunc("POST", pattern, handler)}...

然后再修改一下調用方式。

copyRouter.GET("/sayHi",sayHi)

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

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

func (c *CopyRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {  if f, ok := c.router[r.Method][r.URL.String()]; ok {    func (handler http.Handler){      start := time.Now()      log.Printf(" 請求 [%s] 開始時間為 : %v/n", r.URL.String(), start)      f.ServeHTTP(w, r)      log.Printf(" 請求 [%s] 完成時間為 : %v/n", r.URL.String(), time.Since(start))    }(f)  }}

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

還有一點,就是我們在定義這個路由結構體的時候,能否將這個類型修改為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) {  f(w, r)}

這里HandlerFunc起到了一個適配器的作用,這是一個非常巧妙的設計,不得不說golang在接口這方面確實設計的很精妙。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲a一级视频| 国模精品视频一区二区| 91伊人影院在线播放| 亚洲老头同性xxxxx| 国产精品视频久| 亚洲第一色在线| 久久99国产精品久久久久久久久| 国产精彩精品视频| 国产精品入口免费视| 97视频在线观看网址| 国产亚洲激情视频在线| 亚洲自拍另类欧美丝袜| 欧美激情综合色| 中文字幕av一区二区三区谷原希美| 欧美视频中文在线看| 日韩精品免费综合视频在线播放| 精品露脸国产偷人在视频| 国产精品人成电影在线观看| 日韩欧美国产一区二区| 国产精品va在线播放我和闺蜜| 欧美精品videofree1080p| 国内精品久久久久久影视8| 国产69久久精品成人| 韩国欧美亚洲国产| 91精品91久久久久久| 亚洲sss综合天堂久久| 91在线|亚洲| 青青久久av北条麻妃海外网| 精品一区二区亚洲| 日韩激情av在线免费观看| 国产精品91视频| 日本久久精品视频| 午夜精品一区二区三区在线视频| 久久久久国产精品www| 日韩专区在线观看| 日韩综合视频在线观看| 亚洲人午夜精品| 欧美性xxxxxx| 粗暴蹂躏中文一区二区三区| 精品国产一区二区在线| 国产精品久久久亚洲| 中文字幕免费精品一区高清| 欧美电影《睫毛膏》| 国模gogo一区二区大胆私拍| 国产精品亚洲片夜色在线| 亚洲爱爱爱爱爱| 一本一本久久a久久精品牛牛影视| 97精品一区二区视频在线观看| 亚洲天堂免费观看| 一区二区亚洲欧洲国产日韩| 亚洲欧洲国产精品| 国语对白做受69| 国产日韩欧美视频| 国产欧美久久久久久| 精品国产一区二区三区久久久| 亚洲精品福利资源站| 久久成人免费视频| 国内成人精品视频| 欧美男插女视频| 亚洲影视九九影院在线观看| 欧美午夜精品久久久久久久| 欧美视频专区一二在线观看| 91视频-88av| 成人免费网站在线看| 国产精品一区av| x99av成人免费| 国产91网红主播在线观看| 国产精品免费视频xxxx| 成人久久18免费网站图片| 国产精品日本精品| 欧美性猛交丰臀xxxxx网站| 国产欧美在线播放| 亚洲精品网址在线观看| 欧美疯狂xxxx大交乱88av| 午夜精品在线视频| 国产精彩精品视频| 国产精品电影在线观看| 日韩的一区二区| 国产精品亚发布| 亚洲国产精久久久久久久| 国产欧美日韩亚洲精品| 国产一区二区三区在线观看网站| 51精品在线观看| 91精品国产电影| 精品视频www| 中文字幕日韩精品在线| 欧美在线激情网| 伦伦影院午夜日韩欧美限制| 久久久免费电影| 精品久久久久国产| 欧美性高跟鞋xxxxhd| 国产亚洲精品91在线| 欧美激情xxxx性bbbb| 中文字幕精品在线视频| 91精品国产九九九久久久亚洲| 在线观看91久久久久久| 亚洲国产日韩欧美在线动漫| 第一福利永久视频精品| xxxx欧美18另类的高清| 亚洲r级在线观看| 午夜欧美大片免费观看| 在线视频一区二区| 伊人青青综合网站| 久久综合久久美利坚合众国| 欧美专区国产专区| 亚洲成人xxx| 中文字幕精品网| 亚洲福利在线看| 正在播放国产一区| 日韩二区三区在线| 色综合影院在线| 欧美亚州一区二区三区| 欧美自拍视频在线| 日本高清视频精品| 欧美成人剧情片在线观看| 亚洲视频在线观看| 久久6免费高清热精品| 日韩av一区在线| 亚洲精品久久久久中文字幕欢迎你| 亚洲日本成人女熟在线观看| 欧美激情一区二区三区高清视频| 欧美肥臀大乳一区二区免费视频| 国产精品18久久久久久首页狼| 欧美极品美女电影一区| 久久伊人色综合| 亚洲激情视频在线| 欧美黑人极品猛少妇色xxxxx| 国产精品三级在线| 中文字幕在线视频日韩| 欧美性视频精品| 欧美国产亚洲精品久久久8v| 欧美有码在线观看| 亚洲成人a**站| 久久久亚洲成人| 国产亚洲成av人片在线观看桃| 狠狠色狠狠色综合日日小说| 久久免费观看视频| 亚洲视频国产视频| 欧美日韩亚洲国产一区| 国产精品美女999| 精品福利樱桃av导航| 91亚洲精品久久久| 热草久综合在线| 亚洲欧洲国产精品| 日韩精品在线免费| 91精品国产沙发| 欧美又大又硬又粗bbbbb| 日韩av最新在线观看| 在线成人激情视频| 亚洲精品美女久久久| 久热精品视频在线免费观看| 97人人爽人人喊人人模波多| 亚洲欧洲日产国产网站| 国产精品久久久av久久久| 亚洲桃花岛网站| 久久天天躁狠狠躁夜夜爽蜜月| 国产999精品久久久影片官网| 最近免费中文字幕视频2019| 欧美日韩亚洲一区二区| 亚洲一二三在线| 日韩av在线免播放器| 亚洲国产日韩精品在线| 欧美在线一区二区视频| 91在线视频导航|