开发体验:热重载与运行模式
本章解决什么问题:写代码时反复手动 Ctrl+C 再 go run 太低效;另外 Gin 默认处于调试模式,会打印大量路由注册日志。本章介绍用 air 实现“保存即重启”,并用运行模式控制日志噪音。
Gin 的三种运行模式
gin 全局维护一个运行模式,相关常量与函数为:
- gin.DebugMode(默认):创建引擎时打印 [GIN-debug] 路由表,便于开发观察;
- gin.ReleaseMode:生产模式,关闭调试输出;
- gin.TestMode:供单元测试使用。
在 main 最前面调用 gin.SetMode(gin.ReleaseMode),或在启动进程前设置环境变量 GIN_MODE=release,二者等价(官方文档 gin-gonic.com 有运行模式说明)。注意 SetMode 要在创建引擎之前调用才生效。
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode(gin.ReleaseMode) // 或启动时设置环境变量 GIN_MODE=release
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
c.String(200, "hello")
})
r.Run(":8080")
}
ReleaseMode 下 [GIN-debug] 这类调试日志消失,但请求访问日志仍会打印,它的输出目标由 gin.DefaultWriter 控制(默认 os.Stdout)。
用 air 实现热重载
air 是 Go 社区常用的热重载工具(早期托管在 cosmtrek 名下,目前由 air-verse 组织维护)。它监听目录内源文件变化,自动重新编译并重启进程。air 与 Gin 没有绑定关系,任何 Go 项目都能用。
安装并运行:
go install github.com/air-verse/air@latest
air init # 在项目根目录生成配置文件 .air.toml
air # 开始监听,保存 .go 文件后自动重启
.air.toml 的常见配置项:root 指定监听根目录,[build] 段里的 cmd 是编译运行命令,include_ext 指定关注的后缀,exclude_dir 列出要忽略的目录(构建产物、上传目录等)。不写配置文件直接执行 air 也能按默认规则工作。
开发小建议
- 把热重载与 ReleaseMode 分开用:日常开发保持 DebugMode 看路由表,联调性能或看日志时再切 release。
- 大项目里把 tmp 构建产物、静态资源目录加入 exclude_dir,避免保存资源文件也触发无谓重启。
关键点
- 模式切换两条路:gin.SetMode 或环境变量 GIN_MODE,需在创建引擎前生效。
- air 只是“文件变化 → 重新编译 → 重启进程”的守门人,与框架无关。
- 请求日志目标可用 gin.DefaultWriter 调整,ReleaseMode 不打印调试路由表。
小结
本章让开发循环提速:air 负责保存即重启,SetMode 负责按环境控制日志。下一章进入路由本体,逐个过 HTTP 方法的注册方式。