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

相关推荐
Dobby_0514 小时前
【Go】C++ 转 Go 第(二)天:变量、常量、函数与init函数
vscode·golang·go
光头闪亮亮15 小时前
Golang使用gofpdf库和barcode库创建PDF原材料二维码标签【GBK中文或UTF8】及预览和打印
go
光头闪亮亮17 小时前
go-fitz库-PDF文件所有页转换到HTML及从HTML中提取图片的示例教程
go
用户8556514144618 小时前
环信http请求失败排查
go
_码力全开_2 天前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
程序员爱钓鱼2 天前
Python编程实战 · 基础入门篇 | Python程序的运行方式
后端·go
光头闪亮亮3 天前
gozxing库-对图片中多个二维码进行识别的完整示例教程
go
召摇3 天前
在浏览器中无缝运行Go工具:WebAssembly实战指南
后端·面试·go
王中阳Go4 天前
我发现不管是Java还是Golang,懂AI之后,是真吃香!
后端·go·ai编程
半枫荷4 天前
二、Go语法基础(基本语法)
go