GIN golang框架入门 新手心得

0 阅读3分钟

web框架 轻量级 干净 (相比goframe来说的)

初始化

推荐阅读

gin-gonic.com/zh-cn/ 官方中文框架文档

初始化go

go mod init 填写自己喜欢的名字

初始化框架

go get -u github.com/gin-gonic/gin

快速入门

package main

import "github.com/gin-gonic/gin"

func main() {
  router := gin.Default()
  router.GET("/ping", func(c *gin.Context) { //  /ping 就是路径
    c.JSON(200, gin.H{    //返回的结构体
      "message": "pong",  //json结构体的内容 
    })
  })

    这里的api结构是这样的。 GET(relativePath string, handlers ...HandlerFunc) 
    // HandlerFunc defines the handler used by gin middleware as return value.
    handlers  就是 返回值
  router.Run() // 默认监听 0.0.0.0:8080
}

这就是一个简单的Gin应用

go run main.go 
运行 浏览器访问

API的初步使用

gin.H

gin.H 在源码中其实就是** Map[string]interface.** 这样的结构 其实使用map[string]interface 也可以

GET请求

	router.GET("/hello", func(c *gin.Context) {

		name := c.Query("name")
		if name == "" {
			name = "World"
		}
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello, " + name + "!",
		})
	})

就是访问http://localhost:8080/hello的时候 其实就是调用的这个接口了。 然后返回的 就是"message": "Hello, " + name + "!"。 其中 **name := c.Query("name")。 是get请求当中的获取参数的方法 这样的话 就可以读取到 url中的数据 然后进行一系列的操作了 **




POST请求

	router.POST("/hello", func(c *gin.Context) {
		name := c.PostForm("name")
		age := c.DefaultPostForm("age", "20")//如果没有值 就使用默认值
		if name == "" {
			name = "World"
		}
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello, " + name + "!",
		})
	})

像这样的 其实就是post请求 然后c.PostForm 就是获取表单当中的数据

路由组

// 简单的路由组: v2
  {
    v2 := router.Group("/v2")
    v2.POST("/login", loginEndpoint)
    v2.POST("/submit", submitEndpoint)
    v2.POST("/read", readEndpoint)
  }


函数式的路由组
func InitUser(router *gin.Engine) {
	user := router.Group("/user")
	{
		user.GET("/hello", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
		})
	}
}

main.go注册

package main

import (
	"github.com/gin-gonic/gin"
	"gin-exe/router"
)

func main() {
	router := gin.Default()

	// 注册 v1 和 user 路由
	router.InitV1(router)
	router.InitUser(router)

	// 启动服务
	router.Run(":8080")
}

中间件

上述说道 这个

v2.POST("/login", loginEndpoint)

其实真实的接口样子是

**GET(relativePath string, handlers ...HandlerFunc) **

所以呢。这个 handler不仅仅可以填写我们的controller。还可以填写中间介 来进行一些权限校验啊之类的。 下面是一个小demo

package router

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

func Middleware(c *gin.Context) {

	fmt.Println("Middleware")
	c.Next()
	fmt.Println("Middleware End")
}
func Middleware2(c *gin.Context) {
	fmt.Println("Middleware2")
	c.Next()
	fmt.Println("Middleware2 End")
}
func V1(router *gin.Engine) {
	v1 := router.Group("/v1")
	{
		v1.GET("/hello", Middleware,Middleware2, func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
		})
	}

}

就像这样的。啊 就是一个中间介 就可以进行一些操作

中间件 携程问题

在中间介 使用携程的时候 不能直接使用原始的上下文。应该使用 副本

gin.Context.Copy(). 这个副本还是只读的


func main() {
  router := gin.Default()

  router.GET("/long_async", func(c *gin.Context) {
    // 创建在 goroutine 中使用的副本
    cCp := c.Copy()
    go func() {
      // 用 time.Sleep() 模拟一个长任务。
      time.Sleep(5 * time.Second)

      // 请注意您使用的是复制的上下文 "cCp",这一点很重要
      log.Println("Done! in path " + cCp.Request.URL.Path)
    }()
  })

  router.GET("/long_sync", func(c *gin.Context) {
    // 用 time.Sleep() 模拟一个长任务。
    time.Sleep(5 * time.Second)

    // 因为没有使用 goroutine,不需要拷贝上下文
    log.Println("Done! in path " + c.Request.URL.Path)
  })

  // 监听并在 0.0.0.0:8080 上启动服务
  router.Run(":8080")
}

相应数据

json相应

r.GET("/json",func(c *gin.Context){
    c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
})

结构体相应

    // 2. 结构体响应
    r.GET("/someStruct", func(c *gin.Context) {
        var msg struct {
            Name    string
            Message string
            Number  int
        }
        msg.Name = "root"
        msg.Message = "message"
        msg.Number = 123
        c.JSON(200, msg)
    })

XML相应

// 3.XML
r.GET("/someXML", func(c *gin.Context) {
    c.XML(200, gin.H{"message": "abc"})
})

YMAL 相应

  // 4.YAML响应
    r.GET("/someYAML", func(c *gin.Context) {
        c.YAML(200, gin.H{"name": "zhangsan"})
    })

小结

其实 我的文档一定不是最好的 肯定有更加nb的大神 的理解 比我好

我只是快速入门 分享一下 我学习的笔记 嗯 就是如此

gin就是一个框架 简单的 干净的 (起码对于我来说比goframe轻 快 但是组件不全 很难受qwq)