本文目的
本文旨在向大家簡單的介紹Gin框架。
如需詳細瞭解,可查看個人主頁,有成套視頻講解。Gin框架
Gin是Go的微框架,封裝比較優雅,API友好,源碼註釋比較明確,版本穩定。具有快速靈活,容錯方便等特點。其實對於Go而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。
Gin 特性
- 快速:路由不使用反射,基於Radix樹,內存佔用少。
- 中間件:HTTP請求,可先經過一系列中間件處理,例如:Logger,Authorization,GZIP等。這個特性和 NodeJs 的 Koa 框架很像。中間件機制也極大地提高了框架的可擴展性。
- 異常處理:服務始終可用,不會宕機。Gin 可以捕獲 panic,並恢復。而且有極為便利的機制處理HTTP請求過程中發生的錯誤。
- JSON:Gin可以解析並驗證請求的JSON。這個特性對Restful API的開發尤其有用。
- 路由分組:例如將需要授權和不需要授權的API分組,不同版本的API分組。而且分組可嵌套,且性能不受影響。
- 渲染內置:原生支持JSON,XML和HTML的渲染。
安裝使用
環境要求
要安裝Gin包,首先需要安裝Go並設置Go工作區,即GOPATH。
gin框架需要Go語言版本在1.6及以上。可以通過go version查看自己的Go語言版本是否符合要求。
1、下載並安裝
<code>go get -u github.com/gin-gonic/gin/<code>
2、代碼中導入
<code>import "github.com/gin-gonic/gin"/<code>
安裝完畢後,可以在當前系統的$GOPATH目錄下的src/github.com目錄中找到gin-gonic目錄,該目錄下存放的就是gin框架的源碼。
簡單示例
<code>package mainimport "github.com/gin-gonic/gin"func main() {//Default返回一個默認的路由引擎r := gin.Default() r.GET("/ping", func(c *gin.Context) {//輸出json結果給調用方c.JSON(200, gin.H {"message": "pong",})})r.Run() // 此處不指定端口,則默認8080//r.Run(":8090")//指定端口為8090}/<code>
編譯運行程序,打開瀏覽器,訪問http://localhost:8080/ping頁面顯示:
<code>{"message":"pong"}/<code>
RESTful API
關於RESTful API風格前兩篇文章已經提到過,此處不過多贅述。(詳見 和 )
Gin框架支持開發RESTful API的開發。
<code>func main() { r := gin.Default() r.GET("/book", func(c *gin.Context) {//查詢書籍信息 c.JSON(200, gin.H{ "message": "GET", }) }) r.POST("/book", func(c *gin.Context) {//創建書籍記錄 c.JSON(200, gin.H{ "message": "POST", }) }) r.PUT("/book", func(c *gin.Context) {//更新書籍信息 c.JSON(200, gin.H{ "message": "PUT", }) }) r.DELETE("/book", func(c *gin.Context) {//刪除書籍信息 c.JSON(200, gin.H{ "message": "DELETE", }) })}/<code>
路由組
我們可以將擁有共同URL前綴的路由劃分為一個路由組。
<code>func main() { r := gin.Default() userGroup := r.Group("/user") { userGroup.GET("/index", func(c *gin.Context) {...}) userGroup.GET("/login", func(c *gin.Context) {...}) userGroup.POST("/login", func(c *gin.Context) {...}) } bookGroup := r.Group("/book") { bookGroup.GET("/name", func(c *gin.Context) {...}) bookGroup.GET("/data", func(c *gin.Context) {...}) bookGroup.POST("/data", func(c *gin.Context) {...}) } r.Run()}/<code>
中間件
<code>func main() { // 創建一個不包含中間件的路由器 r := gin.New() // 全局中間件 // 使用 Logger 中間件 r.Use(gin.Logger()) // 使用 Recovery 中間件 r.Use(gin.Recovery()) // 路由添加中間件,可以添加任意多個 r.GET("/benchmark", MyBenchLogger(), benchEndpoint) // 路由組中添加中間件 // authorized := r.Group("/", AuthRequired()) // exactly the same as: authorized := r.Group("/") // per group middleware! in this case we use the custom created // AuthRequired() middleware just in the "authorized" group. authorized.Use(AuthRequired()) { authorized.POST("/login", loginEndpoint) authorized.POST("/submit", submitEndpoint) authorized.POST("/read", readEndpoint) // nested group testing := authorized.Group("testing") testing.GET("/analytics", analyticsEndpoint) } // Listen and serve on 0.0.0.0:8080 r.Run(":8080")}/<code>
本文的初衷為學習筆記的分享,部分圖文來源於網絡,如侵,聯刪。如需瞭解更多,個人主頁,有詳細成套視頻講解。
閱讀更多 晒的被人砍 的文章