go run 不能满足热重载需求,因为它每次执行都重新编译 main 包并启动新进程,不监听文件变化、不管理旧进程,需手动中断重启;官方未内置该功能,推荐使用 air 工具实现零配置热重载。
go run 不能满足热重载需求因为 go run 每次执行都会重新编译整个 main 包并启动新进程,它本身不监听文件变化,也不管理旧进程生命周期。你改完代码必须手动 Ctrl+C 再敲一遍命令,这对快速迭代是硬伤。
air 实现零配置热重载air 是目前最轻量、兼容性最好、默认行为最贴近直觉的 Go 热重载工具。它通过 .air.toml 支持细粒度控制,但多数项目连配置文件都不需要。
go install github.com/cosmtrek/air@latest
air(自动找
main.go 或 cmd/ 下的入口)*.go、**/*.go,修改后秒级重启,终端输出带颜色错误提示air 配置
多数人卡在自定义构建命令或忽略某些路径,导致改了不生效或反复重启。
go mod vendor,需在 .air.toml 中显式启用:vendor = true
main(如 cmd/api 和 cmd/worker),必须指定:main_cmd = "go run cmd/api/main.go"
exclude_dir = ["logs", "tests", "fixtures"]
/,哪怕在 Windows 上air 时的最小可行替代方案如果因安全策略或 CI 环境限制无法装第三方工具,可用 shell 脚本+inotifywait(Linux/macOS)或 fswatch(macOS)搭个裸机版。
apt install inotify-tools):while inotifywait -e modify,create,delete --exclude '\.swp$' -r ./; do go build -o app . && ./app & PID=$!; sleep 0.1; kill $PID 2>/dev/null; done
air;它的 tmp_dir 和 pid_file 机制已解决绝大多数竞品的进程僵死问题air 的 bin 路径或忽略了 build_flags 里要加 -tags=dev 这类条件编译开关。