學習筆記-Golang開發之Gin框架

本文目的

本文旨在向大家簡單的介紹Gin框架。

如需詳細瞭解,可查看個人主頁,有成套視頻講解

Gin框架

Gin是Go的微框架,封裝比較優雅,API友好,源碼註釋比較明確,版本穩定。具有快速靈活,容錯方便等特點。其實對於Go而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。

學習筆記-Golang開發之Gin框架

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>


本文的初衷為學習筆記的分享,部分圖文來源於網絡,如侵,聯刪。如需瞭解更多,個人主頁,有詳細成套視頻講解


分享到:


相關文章: