Go语言不支持运行时热更新,但可通过Air等工具实现开发阶段的热加载:监听文件变化→自动构建→重启服务;推荐Air,安装后执行air init生成配置,再运行air即可,默认监听.go等文件。

Go 语言本身不支持运行时热更新(hot reload),但开发阶段可以通过工具实现代码修改后自动编译、重启服务,达到“热加载”效果。核心思路是:监听文件变化 → 触发构建 → 杀掉旧进程 → 启动新二进制。以下为实用、轻量、跨平台的配置方式。
推荐工具:Air
Air 是目前最主流的 Go 热加载工具,配置简单、稳定性好、支持自定义构建命令和忽略规则。
- 安装:go install github.com/cosmtrek/air@latest
- 初始化配置(项目根目录执行):air init,会生成 .air.toml
- 启动热加载:air(默认监听 main.go 及 ./... 下所有 .go 文件)
关键配置项说明(.air.toml)
编辑 .air.toml 可定制行为,常用项包括:
- root:项目根路径(默认 .)
- tmp_dir:临时二进制存放路径(如 ./tmp),建议加入 .gitignore
- include_ext:监听的文件扩展名,例如 ["go", "tpl", "tmpl", "html"]
- exclude_dir:跳过目录,如 ["assets", "vendor", "node_modules"]
- cmd:自定义启动命令,比如 "go run main.go -env=dev"
- delay:文件变更后延迟执行秒数(防频繁触发,默认 1000ms)
替代方案:Fresh + 自定义脚本
若偏好更轻量或需深度控制流程,可用 fresh(较老但稳定)或直接用 fsnotify 写简易监听脚本:
立即学习“go语言免费学习笔记(深入)”;
- 安装 fresh:go install github.com/pilu/fresh@latest
- 项目根目录加 fresh.conf,指定 build 和 run 命令
- 运行:fresh
- 注意:fresh 不再积极维护,Air 更推荐用于新项目
注意事项与避坑点
热加载不是万能的,实际使用中需注意:
- 数据库连接、全局变量、goroutine 状态不会重置 —— 修改逻辑后仍需手动验证状态一致性
- 如果用 go:generate 或需要预处理(如 protobuf 编译),应在 build_cmd 中一并写入
- Windows 下杀进程可能残留,Air 默认启用 kill_signal = "SIGINT",可改用 kill_delay = "2s" 提高兼容性
- IDE(如 Goland)内置的 Run with Restart 不等同于热加载,它不监听文件变化,需手动触发
基本上就这些。用 Air 搭配一份简洁的 .air.toml,就能覆盖绝大多数 Go Web/API 项目的开发热加载需求,无需侵入代码,也不依赖特定框架。










