大部分時候,咱們須要實現一個 Web 應用,第一反應是應該使用哪一個框架。不一樣的框架設計理念和提供的功能有很大的差異。好比 Python 語言的 django
和flask
,前者大而全,後者小而美。Go語言/golang 也是如此,新框架層出不窮,好比Beego
,Gin
,Iris
等。那爲何不直接使用標準庫,而必須使用框架呢?在設計一個框架以前,咱們須要回答框架核心爲咱們解決了什麼問題。只有理解了這一點,才能想明白咱們須要在框架中實現什麼功能。html
咱們先看看標準庫net/http
如何處理一個請求。git
func main() { http.HandleFunc("/", handler) http.HandleFunc("/count", counter) log.Fatal(http.ListenAndServe("localhost:8000", nil)) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path) }
net/http
提供了基礎的Web功能,即監聽端口,映射靜態路由,解析HTTP報文。一些Web開發中簡單的需求並不支持,須要手工實現。github
hello/:name
,hello/*
這類的規則。當咱們離開框架,使用基礎庫時,須要頻繁手工處理的地方,就是框架的價值所在。但並非每個頻繁處理的地方都適合在框架中完成。Python有一個很著名的Web框架,名叫bottle
,整個框架由bottle.py
一個文件構成,共4400行,能夠說是一個微框架。那麼理解這個微框架提供的特性,能夠幫助咱們理解框架的核心能力。golang
'/hello/:name
。這個教程將使用 Go 語言實現一個簡單的 Web 框架,起名叫作Gee
,geektutu.com
的前三個字母。我第一次接觸的 Go 語言的 Web 框架是Gin
,Gin
的代碼總共是14K,其中測試代碼9K,也就是說實際代碼量只有5K。Gin
也是我很是喜歡的一個框架,與Python中的Flask
很像,小而美。web
7天實現Gee框架
這個教程的不少設計,包括源碼,參考了Gin
,你們能夠看到不少Gin
的影子。算法
時間關係,同時爲了儘量地簡潔明瞭,這個框架中的不少部分實現的功能都很簡單,可是儘量地體現一個框架核心的設計原則。例如Router
的設計,雖然支持的動態路由規則有限,但爲了性能考慮匹配算法是用Trie樹
實現的,Router
最重要的指標之一即是性能。django
但願這個教程可以對你有所啓發,若是對 Gee 有任何好的建議,歡迎提issues - Github 和 PR。教程中的任何問題,能夠直接在文章末尾評論。flask
原文地址:7天用Go從零實現Web框架Gee - 極客兔兔cookie