Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to httprouter.
github:https://gitee.com/yuxio/gin.git
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 (for windows "localhost:8080") }
优雅关闭
http.Server 内置的 Shutdown() 方法优雅地关机。
package main import ( "context" "log" "net/http" "os" "os/signal" "time" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { time.Sleep(5 * time.Second) c.String(http.StatusOK, "Welcome Gin Server") }) srv := &http.Server{ Addr: ":8080", Handler: router, } go func() { // 服务连接 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s ", err) } }() // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间) quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit log.Println("Shutdown Server ...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("Server Shutdown:", err) } log.Println("Server exiting") }
测试
HTTP 测试首选 net/http/httptest
包。
当前目录下仅有test_test.go文件(不需要main函数,且文件名必须以_test.go命名),且go mod init example。
package main import ( "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" ) func setupRouter() *gin.Engine { r := gin.Default() r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") message := name + " is " + action c.String(http.StatusOK, message) }) return r } func TestGin(t *testing.T) { r := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/user/wang/send", nil) r.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, "wang is /send", w.Body.String()) }
测试结果:
$ go test -v -cover === RUN TestGin [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /user/:name/*action --> example.setupRouter.func1 (3 handlers) [GIN] 2020/06/21 - 18:55:03 | 200 | 28.148µs | | GET "/user/wang/send" --- PASS: TestGin (0.00s) PASS coverage: [no statements] ok example 0.014s
参考:
0. https://gin-gonic.com/zh-cn/docs/ 官网中文
3. Gin 教程 连载