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