跳转至

Gin Go Web 框架

一句话概述:Gin 是 Go 语言最流行的 Web 框架,性能极高(零内存分配路由),API 简洁优雅,82K+ GitHub Stars,单核可达 12 万 QPS。

核心知识点

概念白话解释
Engine引擎 = Gin 的核心实例
Context上下文 = 封装请求和响应的对象(每个请求一个)
Middleware中间件 = 请求处理链上的通用逻辑
RouterGroup路由组 = 按前缀分组管理路由
Binding绑定 = 把请求数据自动映射到 Go 结构体
Handler处理器 = 处理具体请求的函数

安装配置

go mod init myapp  # 初始化 Go 模块
go get -u github.com/gin-gonic/gin  # 安装 Gin(v1.10+)

基本使用

// main.go
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

type Sample struct {
    ID      int    `json:"id"`                          // JSON 字段映射
    Name    string `json:"name" binding:"required,min=3"` // 必填,最少3字符
    Species string `json:"species" binding:"required"`
}

func main() {
    r := gin.Default()  // 创建引擎(带 Logger 和 Recovery 中间件)

    // 路由组
    api := r.Group("/api/v1")  // /api/v1 前缀
    {
        api.GET("/samples", listSamples)       // 列出样本
        api.GET("/samples/:id", getSample)     // 获取单个样本
        api.POST("/samples", createSample)     // 创建样本
    }

    r.Run(":8080")  // 启动在 8080 端口
}

func listSamples(c *gin.Context) {
    page := c.DefaultQuery("page", "1")  // 查询参数(有默认值)
    c.JSON(http.StatusOK, gin.H{           // 返回 JSON
        "data": []Sample{},
        "page": page,
    })
}

func getSample(c *gin.Context) {
    id := c.Param("id")  // 路径参数
    c.JSON(http.StatusOK, gin.H{"id": id})
}

func createSample(c *gin.Context) {
    var sample Sample
    if err := c.ShouldBindJSON(&sample); err != nil {  // 绑定 JSON 并验证
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    sample.ID = 1
    c.JSON(http.StatusCreated, sample)  // 201 返回
}

中间件

// 自定义认证中间件
func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")  // 获取请求头
        if token == "" {
            c.JSON(401, gin.H{"error": "未授权"})
            c.Abort()  // 中止请求
            return
        }
        c.Set("user", "admin")  // 存储数据到上下文
        c.Next()  // 继续下一个处理器
    }
}

// 使用中间件
api := r.Group("/api", AuthMiddleware())

结构化项目

// handlers/sample.go — 按功能分文件
type SampleHandler struct {
    db *sql.DB  // 数据库连接
}

func NewSampleHandler(db *sql.DB) *SampleHandler {
    return &SampleHandler{db: db}
}

func (h *SampleHandler) List(c *gin.Context) {
    // 使用 h.db 查询数据库
    c.JSON(200, gin.H{"data": []Sample{}})
}

// main.go 中使用
handler := NewSampleHandler(db)
api.GET("/samples", handler.List)

常见报错

报错信息原因解决方法
binding validation failed请求数据验证失败检查 binding tag 和请求数据
404 page not found路由不匹配检查路由路径和 HTTP 方法
address already in use端口被占换端口或杀占用进程

速查表

// === 请求数据获取 ===
c.Param("id")                     // 路径参数 /users/:id
c.Query("page")                   // 查询参数 ?page=1
c.DefaultQuery("page", "1")       // 带默认值的查询参数
c.ShouldBindJSON(&struct)         // 绑定 JSON 请求体
c.ShouldBindQuery(&struct)        // 绑定查询参数
c.GetHeader("Authorization")      // 获取请求头
c.FormFile("file")                // 获取上传文件

// === 响应 ===
c.JSON(200, data)                 // JSON 响应
c.String(200, "text")             // 文本响应
c.File("path")                    // 文件下载
c.Redirect(301, "/url")           // 重定向
c.Status(204)                     // 只返回状态码

// === 路由 ===
r.GET("/path", handler)           // GET
r.POST("/path", handler)          // POST
r.PUT("/path", handler)           // PUT
r.DELETE("/path", handler)        // DELETE
r.Group("/prefix")                // 路由组
r.Use(middleware)                 // 全局中间件

参考:Gin 文档 | 更新于 2026 年