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 会更轻快。

相关推荐
岁忧6 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
Nejosi_念旧6 小时前
解读 Go 中的 constraints包
后端·golang·go
mao毛13 小时前
go Mutex 深入理解
go·源码阅读
钩子波比15 小时前
🚀 Asynq 学习文档
redis·消息队列·go
漫步向前18 小时前
beegoMVC问题知识点汇总
go
一个热爱生活的普通人21 小时前
Go 泛型终极指南:告别 interface{},写出更安全、更强大的代码!
后端·go
DemonAvenger1 天前
实现可靠的 UDP 协议:Go 语言版本
网络协议·架构·go
程序员爱钓鱼1 天前
Go语言实战案例-读取用户输入并打印
后端·google·go
{⌐■_■}1 天前
【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理
数据库·分布式·mysql·kafka·go