Gin是一个用Go编写的高性能HTTP Web框架

Gin Web Framework


Gin 是一个用 Go 编写的高性能 HTTP Web 框架。它提供了类似 Martini 的 API,但性能显著提升——速度提升高达 40 倍——这得益于 httprouter。Gin 专为构建 REST API、Web 应用和微服务而设计,这些应用对速度和开发者效率至关重要。

为什么选择 Gin?

Gin 将 Express.js 风格路由的简洁性与 Go 语言的性能优势相结合,使其成为以下应用的理想之选:

  • 构建高吞吐量 REST API
  • 开发需要处理大量并发请求的微服务
  • 创建需要快速响应的 Web 应用
  • 使用最少的样板代码快速构建 Web 服务原型

Gin 的主要特性:

  • 零分配路由器 - 极其节省内存的路由,无需堆分配
  • 高性能 - 基准测试表明其速度优于其他 Go Web 框架
  • 中间件支持 - 可扩展的中间件系统,用于身份验证、日志记录、CORS 等
  • 无崩溃 - 内置恢复中间件,可防止服务器崩溃
  • JSON 验证 - 自动进行请求/响应 JSON 绑定和验证
  • 路由分组 - 组织相关路由并应用常用中间件
  • 错误管理 - 集中式错误处理和日志记录
  • 内置渲染 - 支持 JSON、XML、HTML 模板等
  • 可扩展 - 庞大的社区中间件和插件生态系统

入门

先决条件

  • Go 版本:Gin 需要 Go 版本 1.23 或更高版本
  • Go 基础知识:熟悉 Go 语法和包管理将有所帮助

安装

借助 Go 的模块支持,只需在代码中导入 Gin,Go 就会在构建过程中自动获取它:

go 复制代码
import "github.com/gin-gonic/gin"

您的第一个 Gin 应用程序

以下是一个完整的示例,展示了 Gin 的简洁性:

go 复制代码
package main

import (
  "net/http"

  "github.com/gin-gonic/gin"
)

func main() {
  // Create a Gin router with default middleware (logger and recovery)
  r := gin.Default()
  
  // Define a simple GET endpoint
  r.GET("/ping", func(c *gin.Context) {
    // Return JSON response
    c.JSON(http.StatusOK, gin.H{
      "message": "pong",
    })
  })
  
  // Start server on port 8080 (default)
  // Server will listen on 0.0.0.0:8080 (localhost:8080 on Windows)
  r.Run()
}

运行应用程序:

  1. 将以上代码保存为 main.go
  2. 运行应用程序:
sh 复制代码
go run main.go
  1. 打开浏览器并访问 http://localhost:8080/ping
  2. 您应该看到:{"message":"pong"}

此示例演示的内容:

  • 使用默认中间件创建 Gin 路由器
  • 使用简单的处理函数定义 HTTP 端点
  • 返回 JSON 响应
  • 启动 HTTP 服务器

后续步骤

运行您的第一个 Gin 应用程序后,请浏览以下资源了解更多信息:

📚 学习资源

  • Gin 快速入门指南 - 包含 API 示例和构建配置的综合教程
  • 示例仓库 - 可立即运行的示例,演示各种 Gin 用例:
  • REST API 开发
  • 身份验证和中间件
  • 文件上传和下载
  • WebSocket 连接
  • 模板渲染

📖 文档

API 参考

用户指南

gin-gonic.com 提供多种语言的综合文档:

官方教程

⚡ 性能基准测试

与其他 Go Web 框架相比,Gin 展现了卓越的性能。它使用自定义版本的 HttpRouter 来实现最高效率。查看详细基准测试 →

Gin 与其他 Go 框架对比(GitHub API 路由基准测试):

Benchmark name (1) (2) (3) (4)
BenchmarkGin_GithubAll 43550 27364 ns/op 0 B/op 0 allocs/op
BenchmarkAce_GithubAll 40543 29670 ns/op 0 B/op 0 allocs/op
BenchmarkAero_GithubAll 57632 20648 ns/op 0 B/op 0 allocs/op
BenchmarkBear_GithubAll 9234 216179 ns/op 86448 B/op 943 allocs/op
BenchmarkBeego_GithubAll 7407 243496 ns/op 71456 B/op 609 allocs/op
BenchmarkBone_GithubAll 420 2922835 ns/op 720160 B/op 8620 allocs/op
BenchmarkChi_GithubAll 7620 238331 ns/op 87696 B/op 609 allocs/op
BenchmarkDenco_GithubAll 18355 64494 ns/op 20224 B/op 167 allocs/op
BenchmarkEcho_GithubAll 31251 38479 ns/op 0 B/op 0 allocs/op
BenchmarkGocraftWeb_GithubAll 4117 300062 ns/op 131656 B/op 1686 allocs/op
BenchmarkGoji_GithubAll 3274 416158 ns/op 56112 B/op 334 allocs/op
BenchmarkGojiv2_GithubAll 1402 870518 ns/op 352720 B/op 4321 allocs/op
BenchmarkGoJsonRest_GithubAll 2976 401507 ns/op 134371 B/op 2737 allocs/op
BenchmarkGoRestful_GithubAll 410 2913158 ns/op 910144 B/op 2938 allocs/op
BenchmarkGorillaMux_GithubAll 346 3384987 ns/op 251650 B/op 1994 allocs/op
BenchmarkGowwwRouter_GithubAll 10000 143025 ns/op 72144 B/op 501 allocs/op
BenchmarkHttpRouter_GithubAll 55938 21360 ns/op 0 B/op 0 allocs/op
BenchmarkHttpTreeMux_GithubAll 10000 153944 ns/op 65856 B/op 671 allocs/op
BenchmarkKocha_GithubAll 10000 106315 ns/op 23304 B/op 843 allocs/op
BenchmarkLARS_GithubAll 47779 25084 ns/op 0 B/op 0 allocs/op
BenchmarkMacaron_GithubAll 3266 371907 ns/op 149409 B/op 1624 allocs/op
BenchmarkMartini_GithubAll 331 3444706 ns/op 226551 B/op 2325 allocs/op
BenchmarkPat_GithubAll 273 4381818 ns/op 1483152 B/op 26963 allocs/op
BenchmarkPossum_GithubAll 10000 164367 ns/op 84448 B/op 609 allocs/op
BenchmarkR2router_GithubAll 10000 160220 ns/op 77328 B/op 979 allocs/op
BenchmarkRivet_GithubAll 14625 82453 ns/op 16272 B/op 167 allocs/op
BenchmarkTango_GithubAll 6255 279611 ns/op 63826 B/op 1618 allocs/op
BenchmarkTigerTonic_GithubAll 2008 687874 ns/op 193856 B/op 4474 allocs/op
BenchmarkTraffic_GithubAll 355 3478508 ns/op 820744 B/op 14114 allocs/op
BenchmarkVulcan_GithubAll 6885 193333 ns/op 19894 B/op 609 allocs/op
  • (1):在恒定时间内实现的总重复次数,数值越高,结果越可靠
  • (2):单次重复时长(ns/op),数值越低越好
  • (3):堆内存(B/op),数值越低越好
  • (4):每次重复的平均分配次数(allocs/op),数值越低越好

🔌 中间件生态系统

Gin 拥有丰富的中间件生态系统,可满足常见的 Web 开发需求。探索社区贡献的中间件:

  • gin-contrib - 官方中间件集合,包含:

  • 身份验证(JWT、基本身份验证、会话)

  • CORS、速率限制、压缩

  • 日志记录、指标、追踪

  • 静态文件服务、模板引擎

  • gin-gonic/contrib - 其他社区中间件

🏢 生产环境使用

Gin 为许多高流量生产环境的应用和服务提供支持:

  • gorush - 高性能推送通知服务器
  • fnproject - 容器原生、无服务器平台
  • photoprism - AI 驱动的个人照片管理
  • lura - 超高性能 API 网关框架
  • picfit - 实时图像处理服务器
  • dkron - 分布式作业调度系统

🤝 贡献

Gin 是由来自世界各地的数百名贡献者共同打造的。我们欢迎并感谢您的贡献!

如何贡献

  • 🐛 报告错误 - 帮助我们识别和解决问题
  • 💡 功能建议 - 分享您的改进想法
  • 📝 改进文档 - 帮助我们使文档更清晰
  • 🔧 提交代码 - 修复错误或实现新功能
  • 🧪 编写测试 - 提高我们的测试覆盖率

贡献入门

  1. 查看我们的 CONTRIBUTING.md 获取详细指南
  2. 加入我们的社区讨论并提出问题

所有贡献都值得重视,并有助于让 Gin 更好地服务于每个人!

关于项目

Gin 是一个用 Go 编写的高性能 HTTP Web 框架。它提供了类似 Martini 的 API,但性能显著提升——速度提升高达 40 倍(这得益于 httprouter)。Gin 专为构建 REST API、Web 应用程序和微服务而设计。
MIT
Golang
86,379
8446
1367
2014-06-17
2025-10-09

增长趋势 - stars