go run 本身不支持自动重启,必须依赖第三方工具;reflex最轻量且适配容器,air更适配宿主机开发,调试时需停用热重载工具以避免端口冲突。

go run 本身不支持自动重启,得靠外部工具
Go 标准工具链没有内置文件监听和热重载能力。go run 是一次性执行命令,改完代码必须手动再敲一遍。想保存即生效,必须引入第三方工具——不是配置问题,是设计如此。
reflex 是最轻量、最适配容器开发的自动重启方案
相比 nodemon(需 Node.js 环境),reflex 是纯 Go 编写的二进制工具,无运行时依赖,特别适合 Alpine 容器场景:
- 在
Dockerfile或docker-compose.yml的command中用reflex -r "\.go$" -- sh -c "go run -mod=vendor main.go" -
-r后的正则必须加引号,否则 shell 在 compose 解析阶段就展开成空,导致匹配失效 - Alpine 镜像里用
apk add --no-cache reflex安装,别用go install—— 容器内没配GOPATH,容易失败 - 确保
working_dir: /app已设置,否则reflex启动时 cwd 错误,go run报no Go files in current directory
本地开发用 air 更省心,但注意 Windows 路径兼容性
air 内置 TOML 配置、支持构建前 hook、对 Windows 文件系统更友好,适合宿主机直连开发:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 安装:
go install github.com/cosmtrek/air@latest - 生成默认配置:
air init,然后改root为当前项目路径 - Windows 下若遇到
invalid character报错,检查.air.toml是否含 BOM 或中文标点 - 避免在
air中启用build_delay过长(如 >1s),否则小修改后响应明显滞后
调试模式下自动重启会干扰 Delve,必须分开流程
VS Code 调试时启动的是 dlv 进程,不是 go run;如果同时跑 reflex 或 air,会导致端口冲突或进程抢占:
- 调试时停用所有热重载工具,直接用 VS Code 的
Debug: Start Debugging(F5) -
docker-compose.yml中调试服务与开发服务应拆成两个service,避免ports: ["2345:2345"]和热重载共存 - Delve 启动命令必须含
--headless --continue --accept-multiclient --api-version=2,缺任何一项都可能让 VS Code 连不上
实际跑起来最稳的组合是:宿主机开发用 air,Docker Compose 开发用 reflex,调试单独起一个带 Delve 的服务。三者混用会触发不可预测的进程状态竞争。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










