goland配热重载核心是确保air在go.mod所在目录运行,否则监听失效;需同步配置watch和build的include_ext、路径严格对齐,并禁用http长连接避免旧进程残留。

GoLand 里配热重载,核心就一条:别让 air 在错误的目录下瞎跑,否则改了代码它根本看不见。
必须在 go.mod 所在目录启动 air
很多人把 air 命令丢进 GoLand 终端就完事,结果改 internal/handler/user.go 没反应——大概率是因为你在 cmd/api/ 目录下开了终端,而 go.mod 其实在上层项目根目录。
-
air默认只监听当前工作目录及子目录下的文件,不会跨级向上找go.mod -
root = "."在.air.toml中必须指向含go.mod的目录,写成绝对路径(比如C:\myapp)会导致换机器后失效 - GoLand 终端默认打开位置不一定是项目根目录,手动
cd到go.mod所在路径再执行air
watch.include_ext 和 build.include_ext 必须完全一致
改了 config.yaml 或 templates/*.html 不触发重启?不是 air 坏了,是它压根没被告诉“这些文件也得管”。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 默认只监听
*.go,.yaml、.tmpl、.html全都不在白名单里 - 必须同时在
[watch]和[build]两个区块里配include_ext = ["go", "yaml", "yml", "html", "tmpl"],漏一个就不生效 - Windows 用户注意路径分隔符:配置里一律用正斜杠
/,写.\tmp\main会导致构建失败
build.bin 和 build.cmd 输出路径必须严格对齐
看到 exec: "./tmp/main": file does not exist?这不是编译失败,是 air 找不到它自己该运行的二进制。
-
build.cmd = "go build -o ./tmp/main ."→build.bin就必须是"./tmp/main"(开头带点、斜杠方向正确) - 如果入口是
cmd/api/main.go,命令得写成go build -o ./tmp/api cmd/api/main.go,对应bin = "./tmp/api" - Linux/macOS 上若
./tmp不可写,或 NFS 挂载 strip 权限,加&& chmod +x ./tmp/main到cmd更稳
HTTP keep-alive 会让“重启成功”变成假象
终端显示 building... 后又 starting...,但浏览器刷新还是旧逻辑?大概率是 TCP 连接复用把请求转给了还没彻底退出的旧进程。
- 开发阶段启动
http.Server时加srv.SetKeepAlivesEnabled(false) - 测试用
curl -H "Connection: close" http://localhost:8080,比狂点浏览器刷新靠谱得多 - Windows 下高频保存易触发文件锁,
build.delay = 1000是刚需,别设低于 500
最常被忽略的一点:air 从不处理 graceful shutdown。它只负责杀旧进程、跑新二进制。如果你的程序没调 srv.Shutdown(),旧服务残留端口、连接、goroutine 都是常态。










