gin问题知识点汇总

1.创建路由

golang 复制代码
r := gin.Default()
r.Use(loggingMiddleware()) // 注册全局日志中间件

全局中间件可以帮助我们输出日志

go 复制代码
// -------------------------
// 全局中间件
// -------------------------
func loggingMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
       fmt.Printf("[LOG] %s %s\n", c.Request.Method, c.Request.RequestURI)
       c.Next() // 继续后续处理
    }
}

2.基本路由

golang 复制代码
// -------------------------
// 基本路由 + HTML 渲染
// -------------------------
r.LoadHTMLGlob("templates/*")
r.GET("/", func(c *gin.Context) {
    c.HTML(http.StatusOK, "index.html", gin.H{"title": "首页"})
})

指定templates路径下的所有.html文件,通过/的方式访问index.html,标题"首页"

3.cookie和session

golang 复制代码
// -------------------------
// Cookie & 简易 Session
// -------------------------
r.GET("/set_cookie", func(c *gin.Context) {
    c.SetCookie("session_id", "abc123", 3600, "/", "", false, true)
    c.String(http.StatusOK, "已设置 Cookie")
})
r.GET("/get_cookie", func(c *gin.Context) {
    if v, err := c.Cookie("session_id"); err == nil {
       c.String(http.StatusOK, "Cookie: %s", v)
    } else {
       c.String(http.StatusOK, "没有 Cookie")
    }
})

绑定cookie和session

4.Router Group

golang 复制代码
// -------------------------
// Route Group + 中间件
// -------------------------
api := r.Group("/api")
api.Use(authMiddleware()) // API 下需要先登录
{
    // -------------------------
    // RESTful 风格的用户接口
    // -------------------------
    users := api.Group("/users")
    {
       // List 用户列表
       users.GET("", func(c *gin.Context) {
          // 示例:构造两个用户返回
          list := []User{
             {ID: 1, Name: "张三", Email: "a@example.com", Age: 30},
             {ID: 2, Name: "李四", Email: "b@example.com", Age: 25},
          }
          c.JSON(http.StatusOK, list) // JSON 渲染
       })

       // Create 创建用户(JSON 绑定 & 验证)
       users.POST("", func(c *gin.Context) {
          var u User
          if err := c.ShouldBindJSON(&u); err != nil {
             // 验证失败
             c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
             return
          }
          u.ID = 3 // 模拟新 ID
          c.JSON(http.StatusCreated, u)
       })

       // GetOne URL 参数
       users.GET("/:id", func(c *gin.Context) {
          id, _ := strconv.Atoi(c.Param("id"))
          u := User{ID: id, Name: "用户" + c.Param("id"), Email: "c@example.com", Age: 20}
          c.JSON(http.StatusOK, u)
       })

       // Update 更新(表单绑定)
       users.PUT("/:id", func(c *gin.Context) {
          id, _ := strconv.Atoi(c.Param("id"))
          var u User
          if err := c.ShouldBind(&u); err != nil { // 支持 JSON & form
             c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
             return
          }
          u.ID = id
          c.JSON(http.StatusOK, u)
       })

       // Delete 删除
       users.DELETE("/:id", func(c *gin.Context) {
          c.Status(http.StatusNoContent)
       })
    }
}

在/api下通过不同的请求方式触发对应的方法执行。

5.上传文件

golang 复制代码
// -------------------------
// 上传文件
// -------------------------
r.POST("/upload", func(c *gin.Context) {
    file, _ := c.FormFile("file") // 表单字段名为 file
    dst := "./uploads/" + file.Filename
    if err := c.SaveUploadedFile(file, dst); err != nil {
       c.String(http.StatusInternalServerError, "上传失败")
       return
    }
    c.String(http.StatusOK, "已保存到 %s", dst)
})

请求头、URL 参数、表单数据、JSON、响应写入、状态码、中间件共享数据等等------都统一挂在 *gin.Context 这个对象里

6.参数验证

golang 复制代码
// -------------------------
// 参数验证(Validator 示例)
// -------------------------
r.GET("/validate", func(c *gin.Context) {
    type Query struct {
       Page int `form:"page" binding:"required,min=1"`
    }
    var q Query
    if err := c.ShouldBindQuery(&q); err != nil {
       c.JSON(http.StatusBadRequest, gin.H{"err": err.Error()})
       return
    }
    c.JSON(http.StatusOK, gin.H{"page": q.Page})
})

在struct里定义好规则,请求的时候判断page的值是否符合要求。

7.gin启动

golang 复制代码
// 启动
r.Run(":8000")

如果不加参数,默认的端口是8080端口

总结

  • 如果要快速搭建一个管理后台 或标准化企业级应用,想少写重复代码、要内置 ORM/模板/验证/任务等,Beego 更合适。

  • 如果只需构建一个高性能微服务 ,路由或中间件足够,且想最大程度减少依赖、追求极致性能,Gin 会更轻快。

相关推荐
研究司马懿19 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰2 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘2 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤2 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto4 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo