Gin-Web-Framework官方指南中文(上篇)
- 2019 年 10 月 30 日
- 筆記
一、介紹
Gin是什麼?
Gin是一個用Golang寫的HTTP web框架。它具有類似於Martini的API,性能更高-快40倍。 如果需要很好的性能,那麼肯定是推薦現在使用Gin。
特點:
快:
基於基數樹的路由,佔用記憶體少。 沒有反射。 可預測的API性能
中間件支援:
進來的HTTP請求被中間件鏈處理然後最後執行。舉個例子比如日誌,鑒權,解壓等行為攔截操作之後,將資訊發送到DB
奔潰無影響:
gin能捕獲在HTTP請求的異常並且恢復,通過這種方式,你的服務可以保證高可用,作為一個例子,他可以提供上報異常監控
JSON校驗:
Gin能解析並且校驗請求中的JSON,比如校驗某些必填入值
路由分組:
更好路由,鑒權必要或者非必要,不同的API版本,另外,分組可以無限嵌套並且對性能不會造成影響
錯誤管理:
Gin提供了一個便利的方式去收集所有的錯誤發生在HTTP請求中的,最後一個中間件可以寫他們到一個日誌文件或者一個資料庫並且通過網路發送傳輸。
內置渲染:
Gin提供了一個簡單實用渲染的JSON、XML和HTML的方式
可擴展性:
創建一個新的中間件非常容易,僅僅是看看示例程式碼就能明白。
二、快速開始入門
前提條件:
go的版本1.9+,未來不再支援1.7或者1.8
安裝:
首先是建立在已經安裝golang和設置好了你的工作目錄空間。
這裡需要注意的一點是所有通過go下載的GitHub內容都在$GOPATH/src/github.com目錄下
下載安裝gin
go get -u github.com/gin-gonic/gin
程式碼引入包
import "github.com/gin-gonic/gin"
可選項,如果需要使用http.StatusOK
import "net/http"
初始化本地倉庫
使用一個vendor工具比如Govendor
go get github.com/kardianos/govendor
創建項目文件夾並且打開
mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_"
使用vendor初始化你的項目並且添加gin框架(如果這個時候報錯找不到你的govendor,則你需要先執行一個命令行設置下你的執行gopath環境目錄)
export PATH=$PATH:$(go env GOPATH)/bin
govendor init govendor fetch github.com/gin-gonic/[email protected]
複製一個項目模板到項目(很可能會504網關超時)
curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go
運行項目
go run main.go
開始入手項目
創建一個go 文件比如example.go
touch example.go
內容寫入以下程式碼
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
然後運行程式碼,命令行
go run example.go
或者Goland


三、基準測試
可以參考指標-測試結果
Gin的默認的JSON包encoding/json
如果想用其他的jsoniter,可以
go build -tags=jsoniter .
四、如何發布
五、測試:如何寫測試用例
使用net/http/httptest包來測試HTTP請求
假設你的程式碼服務
package main func setupRouter() *gin.Engine { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func main() { r := setupRouter() r.Run(":8080") }
測試程式碼命名xxx_test.go
package main import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestPingRoute(t *testing.T) { router := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, "pong", w.Body.String()) }
