zoukankan      html  css  js  c++  java
  • gin入门

    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/ 官网中文

    1. golang轻量级框架-Gin入门

    2. Gin实践 连载八 为它加上Swagger

    3. Gin 教程 连载

  • 相关阅读:
    Treap 模板 poj1442&hdu4557
    2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)
    hdu5785--Interesting(manacher)
    hdu5792--World is Exploding
    HDU5791--Two (DP)
    HDU5781--ATM Mechine(概率dp)
    hdu5773--The All-purpose Zero(LIS变形)
    hdu5769--Substring(后缀数组)
    poj1743--Musical Theme(后缀数组)
    HDU5739-Fantasia(tarjan求割点)
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/12589978.html
Copyright © 2011-2022 走看看