若是你爲本身設計一個小應用程序,你可能不須要一個Web框架,但若是你正在進行生產,那麼你確定須要一個,一個好的應用程序。javascript
雖然您認爲本身擁有必要的知識和經驗,但您是否願意自行編寫全部這些功能的代碼?
您是否有時間找到生產級外部包來完成這項工做? 您肯定這將與您應用的其他部分保持一致嗎?css
這些是推進咱們使用框架的緣由,若是其餘人已經作了這些繁瑣且艱苦的工做,咱們不想本身編寫全部必要的功能。html
Go是一種快速增加的開源編程語言,旨在構建簡單,快速,可靠的軟件。 看看哪些偉大的公司使用Go來爲他們的服務提供支持。java
本文提供了全部必要的信息,以幫助開發人員瞭解有關使用Go開發Web應用程序的最佳選項的更多信息。git
本文包含了最詳細的框架比較,經過從儘量多的角度比較最知名的Web框架:流行度,支持和內置功能:github
Beego:Go編程語言的開源,高性能Web框架。golang
Buffalo:快速Web開發w/Go。web
Echo:高性能,極簡主義的Go Web框架。正則表達式
Gin:用Go(Golang)編寫的HTTP Web框架。它具備相似Martini的API,具備更好的性能。數據庫
Iris:Go in the Universe中最快的Web框架。MVC功能齊全。今天擁抱將來。
Revel:Go語言的高生產力,全棧Web框架。
人氣排序(星級)
框架名稱 | 當前版本 | Watch | Stars | Forks | Issues Open | Issues Close | 框架誕生日 | 最近更新 | 做者 |
---|---|---|---|---|---|---|---|---|---|
beego | stable v1.10.0 | 1159 | 16762 | 3557 | 544 | 1667 | 2012 | 2018年7月31日 GMT+8 下午9:18 | @astaxie |
buffalo | stable 0.12.6 | 125 | 3317 | 259 | 51 | 508 | 2014 | 2018年8月15日 GMT+8 上午5:26 | @markbates |
Echo | stable 3.1 | 513 | 11474 | 1010 | 108 | 665 | 2015 | 2018年8月29日 GMT+8 上午11:49 | @vishr |
Gin | stable v1.stable | 915 | 20122 | 2377 | 126 | 805 | 2014 | 2018年9月1日 GMT+8 上午4:38 | @manucorporat |
Iris | stable v11 | 569 | 11604 | 1177 | 10 | 888 | 2016 | 2018年9月2日 GMT+8 上午12:27 | @kataras |
Revel | stable 0.19.0 | 546 | 10208 | 1260 | 63 | 769 | 2011 | 2018年7月13日 GMT+8 上午3:43 | @robfig |
框架名稱 | 示例 | 示例參考 | 實時支持 |
---|---|---|---|
beego | 49 | https://beego.me/docs | |
buffalo | 6 | https://gobuffalo.io/docs/installation | slack |
Echo | 20 | https://echo.labstack.com/cookbook/hello-world | |
Gin | 15 | https://github.com/gin-gonic/gin/tree/master/examples | gitter |
Iris | 92 | https://github.com/kataras/iris/tree/master/_examples | rocket chat |
Revel | 6 | http://revel.github.io/examples/index.html | gitter |
這裏的astaxie和kataras很是出色,其餘框架將會有更多的例子,至少對我來講,若是我切換到一個新的框架,這是最快速掌握儘量多的信息的最有資源的地方。 一個例子就像1000個單詞。
排序最多,功能較少
核心功能名稱 | Iris | Beego | Revel | Echo | Gin | Buffalo |
---|---|---|---|---|---|---|
路由器:命名路徑參數和通配符(Router: Named Path Parameters & Wildcard*) | ||||||
路由器:正則表達式(Router: Regex*) | ||||||
路由器:分組(Router: Grouping*) | ||||||
路由器:以上全部混合無衝突(Router: All the above Mixed Without Conflict*) | ||||||
路由器:自定義HTTP 錯誤(Router: Custom HTTP Errors*) |
||||||
與net/http 100%兼容(100% compatible with net/http*) |
||||||
中間件生態系統(Middleware ecosystem*) | ||||||
Sinatra 風格API(Sinatra-like API*) |
||||||
服務器:自動HTTPS (Server: Automatic HTTPS*) |
||||||
服務器:正常關機(Server: Gracefully Shutdown*) | ||||||
服務器:多監聽(Server: Multi Listeners*) | ||||||
完整的HTTP/2 (Full HTTP/2*) |
標準(standard) | 標準(standard) | ||||
子域(Subdomains*) | 次要(secondary) | 次要(secondary) | 次要(secondary) | 次要(secondary) | 次要(secondary) | |
會話管理(Sessions*) | 次要(secondary) | |||||
Websockets | ||||||
嵌入到應用(View (aka Templates) Embedded Into App*) | ||||||
View視圖引擎 STD(View Engine: STD*) | ||||||
View視圖引擎 Pug(View Engine: Pug*) | ||||||
View視圖引擎 Django(View Engine: Django*) | ||||||
View視圖引擎 Handlebars(View Engine: Handlebars*) | ||||||
View視圖引擎 Amber(View Engine: Amber*) | ||||||
數據渲染器:Markdown,JSON,JSONP,XML | ||||||
MVC | generator | |||||
緩存(Caching*) | ||||||
文件服務器(File Server*) | ||||||
文件服務器:嵌入到應用程序(File Server: Embedded Into App*) | ||||||
響應能夠在發送以前的生命週期中屢次修改(Response can be Modified Many times through lifecycle before sent*) | ||||||
Gzip | (中間件) middleware | (中間件)middleware | (中間件) middleware | |||
測試框架(Testing Framework*) | ||||||
Typescript Transpiler | ||||||
在線編輯(Online Editor*) | ||||||
日誌系統(Logging System*) | ||||||
維護和自動更新(Maintenance & Auto-Updates*) | ||||||
性能(Performance) | ★★★★★ | ★★★ | ★★ | ★★★★★ | ★★★★★ | ★★★ |
Go中最着名的「Web框架」並非真正的框架,這意味着:Echo,Gin和Buffalo並非真正的(功能齊全的)Web框架但Go社區的大多數人都認爲他們是。所以他們認爲它們與Iris,Beego或Revel至關,所以,咱們也有義務將它們歸入此清單。
除了 Beego 和 Revel 以外,全部上述框架均可以適應任何中間件這是爲 net/http 建立的,其中一些能夠輕鬆地和其餘人一塊兒完成有一些黑客[甚至痛苦是這裏的選擇]。
當您能夠將處理程序註冊到具備動態路徑的路由時。
示例命名路徑參數:
"/user/{username}" 匹配 "/user/me", "/user/speedwheel" etc
路徑參數username
匹配值分別是 me
和 speedwheel
。
示例通配符:
"/user/{path *wildcard}" matches to "/user/some/path/here", "/user/this/is/a/dynamic/multi/level/path" etc
path
路徑參數的值分別是some/path/here
和this/is/a/dynamic/multi/level/path
。
Iris也支持一種稱爲宏的功能,能夠描述爲/user/{username:string}或/user/{username:int min(1)}。
當您可使用帶有過濾器的動態路徑向具備過濾器的路徑註冊處理程序時,應該傳遞一些處理程序以執行處理程序。
示例:
"/user/{id ^[0-9]$}" matches to "/user/42" but not to "/user/somestring"
id路徑參數的值爲42。
當您能夠將公共邏輯或中間件/處理程序註冊到共享相同路徑前綴的特定路由組時。
示例:
myGroup := Group("/user", userAuthenticationMiddleware) myGroup.Handle("GET", "/", userHandler) myGroup.Handle("GET", "/profile", userProfileHandler) myGroup.Handle("GET", "/signup", getUserSignupForm)
您甚至能夠從組中建立子組:
myGroup.Group("/messages", optionalUserMessagesMiddleware) myGroup.Handle("GET', "/{id}", getMessageByID)
這是一個先進但有用的功能,咱們許多人但願它由路由器或Web框架支持,目前只有Iris在Go世界中支持這一功能。
這意味着/{path *wildcard}
和/user/{username}
和/user/static
和/user/{path*wildcard}
之類的東西能夠在同一個路由器中註冊,它能夠正確匹配而不會受到靜態路徑的衝突(/user/static)或通配符(/{path*wildcard})。
當您能夠爲「錯誤」狀態代碼註冊處理程序時。 錯誤http狀態代碼是> = 400狀態代碼,i.s Not Found 404
。
示例:
OnErrorCode(404, myNotFoundHandler)
上面的大多數Web框架僅支持404,405和500註冊,但像Iris,Beego和Revel這樣的功能徹底支持任何狀態代碼甚至任何錯誤代碼(Iris僅支持任何錯誤)。
意味着你有:
*http.Request
和http.ResponseWriter
的上下文。net/http
處理程序轉換爲特定框架的Handler
類型的方法。當您沒必要本身用中間件包裝每一個處理程序時,框架會爲您提供一個完整的引擎來定義流,全局或每一個路由或每組路由。 i.e Use(middleware), Done(middleware) etc.
相似於Sinatra
的APIRegister
在運行時處理程序中用於特定HTTP
方法(和路徑參數)的路由。
示例:
.Get or GET("/path", gethandler) .Post or POST("/path", postHandler) .Put or PUT("/path", putHandler) and etc.
當框架的服務器支持註冊和自動續訂SSL
認證以管理SSL/TLS
傳入鏈接(https)時。 最着名的自動https提供程序是letsencrypt。
按CTRL + C關閉終端應用程序時; 服務器將正常關閉,等待一些鏈接完成其工做(具備特定的超時)或觸發自定義事件以進行清理(即數據庫關閉)。
當框架的服務器支持註冊自定義net.Listener
或使用多個http服務器和地址提供Web應用程序時。
HTTP/2
(Full HTTP/2)當框架支持帶有https
的HTTP/2
和服務器推送功能時。
當您能夠直接從Web應用程序註冊每一個x,y子域的路由。
這個框架不支持這個功能,但你仍然能夠經過啓動多個http服務器來實現它,這樣作的缺點是主應用程序和子域沒有鏈接,默認狀況下不可能在它們之間共享邏輯。
示例:
func setValue(context http_context){ s := Sessions.New(http_context) s.Set("key", "my value") } func getValue(context http_context){ s := Sessions.New(http_context) myValue := s.Get("key") } func logoutHandler(context http_context){ Sessions.Destroy(http_context) }
Wiki: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
當框架支持websocket通訊協議時。 實現是不一樣的。
您應該搜索他們的示例以查看適合您的內容。 我嘗試全部這些的同事告訴我,與其餘API相比,Iris使用更簡單的API實現了最具特點的webosocket
鏈接。
Wiki: https://en.wikipedia.org/wiki/WebSocket
一般,您必須將全部模板文件與Web應用程序的可執行文件並行傳輸。 嵌入到應用程序意味着框架支持與go-bindata
集成,所以最終的可執行文件包含其中的模板,表示爲[]byte
。
什麼是視圖引擎?
當框架支持模板加載,自定義和構建模板功能時,能夠在關鍵部件上完成。
當框架支持經過標準html/template
解析器加載模板時。
當框架支持經過Pug
解析器加載模板時。
當框架支持經過Django
解析器加載模板時。
當框架支持經過Handlebars
解析器加載模板時。
當框架支持經過Amber
解析器加載模板時。
當框架的上下文爲您提供一種簡單的方法來輕鬆地發送/和自定義各類內容類型的響應。
模型 - 視圖 - 控制器(MVC)是用於在計算機上實現用戶界面的軟件架構模式。
它將給定的應用程序劃分爲三個相互關聯的部分。
這樣作是爲了將信息的內部表示與向用戶呈現和接受信息的方式分開。
MVC設計模式將這些主要組件分離,從而實現高效的代碼重用和並行開發。
Wiki: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Web緩存(或HTTP緩存)是用於臨時存儲(緩存)Web文檔(例如HTML頁面和圖像)的信息技術,以減小服務器滯後。
經過它的Web緩存系統文檔; 若是知足某些條件,能夠知足後續要求。[1] Web緩存系統能夠指設備或計算機程序。
Wiki: https://en.wikipedia.org/wiki/Web_cache
當您能夠將(物理)目錄註冊到將自動向客戶端提供此目錄文件的路由時。
一般,您必須傳輸全部靜態文件(如資產; css,javascript文件…)以及應用程序的可執行文件。
支持此功能的框架使您有機會將全部這些數據嵌入到應用程序中,表示爲[]byte
,它們的響應時間也更快,由於服務器能夠直接爲它們提供服務,而無需在物理位置查找文件。
目前只有Iris經過其http_context中的內置響應編寫器支持此功能。
當框架支持此功能時,您能夠在發送到客戶端以前檢索或重置或修改寫入的狀態代碼,正文和標題(在基於net/http
的Web框架中,默認狀況下這是不可能的,由於沒法檢索或更改正文和狀態代碼 書面)。
當你在路由的處理程序中而且你能夠更改響應編寫器以便使用gzip壓縮發送響應時,框架應該處理已發送的頭文件,若是發生任何錯誤,它應該將響應寫入恢復正常。
它也應該可以檢查客戶端是否支持gzip。
gzip是一種文件格式和用於文件壓縮和解壓縮的軟件應用程序
Wiki: https://en.wikipedia.org/wiki/Gzip
當您可使用特定的框架庫測試HTTP時,它的工做就是幫助您輕鬆編寫更好的測試。
示例(目前,只有Iris支持):
func TestAPI(t *testing.T) { app := myIrisApp() tt := httptest.New(t, app) tt.GET("/admin").WithBasicAuth("name", "pass").Expect(). Status(httptest.StatusOK).Body().Equal("welcome") }
myIrisApp返回你想象中的Web應用程序,它有一個/admin
的GET處理程序,受基自己份驗證保護。
上面的簡單測試檢查/admin是否以狀態OK響應,而且使用特定用戶名和密碼傳遞身份驗證,而且其正文爲welcome
。
Typescript
目標是成爲ES6的超集,除了標準定義的全部新東西以外,還將添加一個靜態類型系統。
Typescript
還有一個轉換器,它將咱們的Typescript
代碼(即ES6 +類型)轉換爲ES5或ES3 javascript
代碼,所以咱們能夠在今天的瀏覽器中使用它。
在線編輯器藉助在線編輯器,您能夠快速輕鬆地在線編譯和運行代碼。
自定義日誌記錄系統經過提供諸如顏色編碼,格式化,日誌級別分離,不一樣日誌記錄後端等有用功能來擴展本機日誌包行爲。
以非侵入方式通知用戶「即時」更新框架。
本文翻譯於 https://github.com/speedwheel/awesome-go-web-frameworks
Go Web Iris中文網:https://www.studyiris.com/