zoukankan      html  css  js  c++  java
  • Go——gin 框架基本入门

    概述

    • 为何不选择 beego,理由很简单,其设计风格已经不符合现在开发潮流,现实往往就是这样,看似完美实则鸡肋

    • gin 最大的特点,也是我最为看重的就是中间件功能,说真的,当我在 gin 框架中看到 next 这个关键字,心里真的有点小激动

    中间件

    • 全局中间件

      import (
      	"log"
      	"net/http"
      	"github.com/gin-gonic/gin"
      )
      
      func logger() gin.HandlerFunc {
      
      	return func(c *gin.Context) {
      		log.Println("before is next")
      		c.Next()
      		log.Println("after is next ")
      	}
      }
      
      func main() {
      
      	r := gin.New()
      
      	r.Use(logger())
      
      	r.GET("/user/:name", func(c *gin.Context) {
      		name := c.Param("name")
      		c.String(http.StatusOK, "Hello %s", name)
      	})
      
      	r.GET("/topic/:id", func(c *gin.Context) {
      		id := c.Param("id")
      		c.String(http.StatusOK, "you search is %s", id)
      	})
      
      	r.Run(":8080")
      }
      
    • 路由中间件

      func m1() gin.HandlerFunc {
      	return func(c *gin.Context) {
      
      		log.Println("before is m1")
      		c.Next()
      		log.Println("after is m1 ")
      	}
      }
      
      func m2() gin.HandlerFunc {
      	return func(c *gin.Context) {
      
      		log.Println("before is m2")
      		c.Next()
      		log.Println("after is m2 ")
      	}
      }
      
      func main() {
      
      	r := gin.New()
      
      	r.GET("/user/:name", m1(), func(c *gin.Context) {
      		name := c.Param("name")
      		c.String(http.StatusOK, "Hello %s", name)
      	})
      
      	r.GET("/topic/:id", m2(), func(c *gin.Context) {
      		id := c.Param("id")
      		c.String(http.StatusOK, "you search is %s", id)
      	})
      
      	r.Run(":8080")
      }
      
    • 路由组中间件

      func main() {
      
      	r := gin.New()
      
      	v1 := r.Group("v1", m1())
      	v1.GET("/user/:name", func(c *gin.Context) {
      		name := c.Param("name")
      		c.String(http.StatusOK, "Hello %s", name)
      	})
      	v1.GET("/topic/:id", func(c *gin.Context) {
      		id := c.Param("id")
      		c.String(http.StatusOK, "you search is %s", id)
      	})
      
      	v2 := r.Group("v2", m2())
      	v2.GET("/user/:name", func(c *gin.Context) {
      		name := c.Param("name")
      		c.String(http.StatusOK, "Hello %s", name)
      	})
      	v2.GET("/topic/:id", func(c *gin.Context) {
      		id := c.Param("id")
      		c.String(http.StatusOK, "you search is %s", id)
      	})
      
      	r.Run(":8080")
      }
      
    • 在中间件或处理程序中启动新的 Goroutines 时,您不应该使用其中的原始上下文,您必须使用只读副本

      func main() {
      
      	r := gin.Default()
      
      	r.GET("/long_async", func(c *gin.Context) {
      		// create copy to be used inside the goroutine
      		cCp := c.Copy()
      		go func() {
      			// simulate a long task with time.Sleep(). 5 seconds
      			time.Sleep(5 * time.Second)
      
      			// note that you are using the copied context "cCp", IMPORTANT
      			log.Println("Done! in path " + cCp.Request.URL.Path)
      		}()
      	})
      
      	r.GET("/long_sync", func(c *gin.Context) {
      		// simulate a long task with time.Sleep(). 5 seconds
      		time.Sleep(5 * time.Second)
      
      		// since we are NOT using a goroutine, we do not have to copy the context
      		log.Println("Done! in path " + c.Request.URL.Path)
      	})
      
      	// Listen and serve on 0.0.0.0:8080
      	r.Run(":8080")
      }
      

    帮助文档

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/cnloop/p/9427961.html
Copyright © 2011-2022 走看看