99%新项目应使用gin.default()启动,它自动加载logger和recovery中间件,路由注册须在r.run()前,gin.context是操作请求响应的唯一入口,监听端口用r.run(":8080")。

直接上手 Gin,不用绕弯子:99% 的新项目该用 gin.Default() 启动,而不是 gin.New();路由注册必须在 r.Run() 之前;gin.Context 是你操作请求和响应的唯一入口,所有参数解析、状态返回、中间件跳过都靠它。
怎么初始化一个能跑起来的 Gin 服务
别从空 gin.New() 开始——除非你明确要屏蔽日志和 panic 恢复。默认行为对开发和调试更友好。
-
gin.Default()自动加载Logger(打印访问日志)和Recovery(捕获 panic 防止服务崩掉),适合本地开发和测试环境 -
gin.New()是裸引擎,没中间件,连 404 都不会自动返回,容易误以为“路由没生效”,其实是根本没处理逻辑 - 监听端口用
r.Run(":8080"),不填参数默认是:8080;想换端口就传字符串,比如":3000"或"127.0.0.1:8080" - 启动后终端会输出
[GIN-debug] Listening and serving HTTP on :8080,没这行说明没真正运行起来
怎么写一个带参数的 API 路由
路径参数、查询参数、JSON Body 不是一个写法,混用会拿不到值;Gin 不自动绑定,得显式调用方法。
- 路径参数用
c.Param("id"),对应路由定义如r.GET("/user/:id", handler) - 查询参数(URL ? 后面)用
c.Query("page"),有默认值可写c.DefaultQuery("page", "1") - JSON 请求体必须先声明结构体,再用
c.ShouldBindJSON(&req)解析;失败时它不会自动返回错误,得自己判if err != nil { c.AbortWithStatusJSON(400, gin.H{"error": "invalid json"}) } - 别用
c.GetHeader("Authorization")手动取 token——后面加中间件统一做更干净
为什么中间件里调用 c.Next() 很关键
不调 c.Next(),后续中间件和最终的路由处理器根本不会执行,请求就卡住了,浏览器一直转圈,终端也没日志。
-
c.Next()是中间件链的“接力点”,它让控制权往下传;没有它,整个链就断在当前中间件 -
c.Abort()是中断链,之后所有中间件和 handler 都跳过;常用于鉴权失败或参数校验不通过 -
c.AbortWithStatusJSON(401, ...)会立即终止并返回 JSON,不用再写c.JSON(),否则可能重复写响应 - 日志类中间件通常把
start := time.Now()放c.Next()前,把耗时统计放后面——这样才能测出完整处理时间
怎么避免 go run main.go 启动后改代码不生效
Gin 本身不热重载,每次改完必须手动停止再 go run main.go,但你可以用 air 工具解决。
- 安装:
go install github.com/cosmtrek/air@latest(确保$GOPATH/bin在 PATH 中) - 项目根目录下运行
air,它会监听.go文件变化,自动重启进程 - 默认配置够用,如需忽略某些目录(比如
logs/),编辑.air.toml加exclude_dir = ["logs"] - 注意:
air是开发期工具,上线部署必须用正式构建方式(go build+ systemd 或 Docker)
最常被忽略的一点:Gin 的路由匹配是严格区分大小写的,/API 和 /api 是两个路由;还有,r.StaticFS 挂载静态文件时,路径前缀不能以 / 结尾,否则 404。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











