Go語言的Web框架比較

banq發表於2015-01-20
這是Square工程師對幾個Go語言的Web框架比較:A Comparison of Go Web Frameworks

推薦使用net/http作為入門起步的標準庫,如果你需要路由方面功能,可使用GorillaGocraft/webRevelMartini有太多的依賴注入和其他魔術讓人感覺舒服,Gorilla是最小的。

所有的Web框架都是基於net/http包構建的。

路由功能比較
路由是一種將Web請求對映到一個處理器函式的機制,路由是這些框架的基本功能,Gorilla似乎是最靈活的,但是它們基本上不相上下,一個重點是看看這個路由功能實現是否直接:

1.Revel:支援URL引數和萬用字元,舉例, "/hotels/:id" 匹配正則 "/hotels/[^/]+";而"/hotels/*id"匹配"/hotels/.+"。一個revel應用在配置檔案中指定路由。

2.Martini: 支援URL引數 萬用字元和正規表示式,舉例: "/hotels/:id" 和"/hotels/**", 路由捆綁到一個特定的HTTP方法(GET POST HEAD等)

3.Gocraft/web:支援URL引數和正規表示式,如"/hotels/:id" 和 "/hotels/:id:[0-9]+", gocraft/web花費了更多努力在將路由結構成一個tree而不是list集合,這樣能夠獲得更高效能。

4. Gorilla:支援URL引數,每個引數都可以用正則匹配,如"/hotels/{id}" 匹配正則 "/hotels/[^/]+",而 "/hotels/{id:[0-9]+}" 匹配正則 "/hotels/[0-9]+",除了基於URL的路由,Gorilla支援基於HTTP方法的路由,還有HTTP頭、URL schema、查詢引數、或任意函式,路由可透過程式指定。

資料繫結比較
資料繫結是將請求引數轉換成處理器使用的機制,下面是它們在資料繫結方面的比較:

1. Revel: 匹配引數可以使用map[string]string,也可透過引數傳給處理器方法,如"/hotels/:id"將被對映到Show(id int)方法,而id引數將自動填入,Revel的反射和注射使用非常神奇。

2.Martini: 匹配的引數也可透過 map[string]string 獲得,它將被注入到處理器的方法引數,Martini提供完整的依賴注入到處理器方法的引數,允許指定全域性或請求級別的對映,如果你喜歡依賴注入,你會覺得找到家了。

3.Gocraft/web:匹配的引數可以透過 map[string]string 獲得,不像gorilla,它提供http.ResponseWriter 和 http.Request的包裝器,引數是其欄位,欄位型別是web.Request。

4.Gorilla:匹配的引數可以透過 map[string]string 獲得。這是透過mux.Vars(request)呼叫實現的,沒有依賴注入, 沒有魔術。

控制器比較
控制器或上下文context是用於維護每個請求的狀態。

1.Revel: 控制器強概念,你的應用控制器嵌入一個*revel.Controller ,當從revel.Controller回到你的應用控制器型別時,有一點尷尬的型別斷言轉換。

2.Martini: 沒有明顯的控制器或上下文概念,但是依賴注入允許你易於建立你自己這樣的概念。

3.Gocraft/web:路由和使用者定義上下文結構聯絡,上下文結構通常由中介軟體完成。

4.Gorilla:不支援控制器和上下文,你自己實現。

中介軟體的比較
中介軟體是一個跨處理器提供通用功能的技術,比如日誌就是一箇中介軟體,注意,沒什麼神奇的基礎設施來支援中介軟體。框架並不是呼叫一個單個處理器方法,而是呼叫一系列的方法。

1. Revel:稱中介軟體為 攔截器
2. Martini:大多數功能是在中介軟體,包括第三方釋出包
3. Gocraft/web: 中介軟體是完全和一個上下文聯絡的,提供跨處理器的通用功能,比如使用者授權。
4.Gorilla: 不支援中介軟體,你自己實現

雜類比較
1.Revel:類似Rails,兩個都是最全面、最固執己見的框架。提供路由,資料繫結,驗證,會話,快取,測試框架和國際化。指定的目錄結構(比如區分單獨的“模型”,“控制器”和“意見”目錄)。見鬼,你甚至不用寫main()功能,Revel為你生成一個。

2.Martini:靈感來自Express ( Node.js web框架) 和 Sinatra (a Ruby web 框架).

3.Gocraft/web : 一個庫 不是一個框架

4.Gorilla: 由一系列獨立的庫包組成,可以取捨。

在以上分析中不傾向於任何全功能的框架。標準庫的力量可以讓我們在沒有任何上述框架情況下構建複雜的應用程式,這些框架只是選項,Gorilla是我們最喜歡的因為它是微侵入。


相關文章