真正有效的清理命令只有go clean -modcache,它安全、幂等地清空$GOMODCACHE中的模块缓存,不影响go.mod、go.sum或vendor,后续构建按需下载缺失或校验失败的模块。

GoLand 本身不管理 Go 缓存,它只是调用 go 命令;所谓“过期缓存”实际是 $GOCACHE 和 $GOMODCACHE 里的陈旧构建产物或模块副本,必须用 go clean 系列命令清理,不能靠 IDE 设置一键解决。
go clean -cache 清的是什么、什么时候必须清
它删的是 $GOCACHE(默认 macOS 在 ~/Library/Caches/go-build,Linux 在 $HOME/.cache/go-build),里面存着编译中间文件(.a 归档)、测试快照、模糊测试数据等。这些文件不会自动过期,尤其在以下情况容易出问题:
- 切换了
CGO_ENABLED值(比如从1改成0后又改回来),旧缓存可能静默导致链接失败 - 升级 Go 版本后首次构建,部分缓存未被标记为失效,引发符号找不到或类型不匹配
- 频繁跑
go test -race,几天内$GOCACHE就能涨到 30GB+ - 执行
go clean -cache后磁盘空间没立刻释放?可能是 Linux 下文件仍被gopls或后台构建进程占用,需等进程退出或重启 IDE
go clean -modcache 不是删 vendor,而是重置模块源码缓存
go clean -modcache 删除的是 $GOPATH/pkg/mod(或 $GOMODCACHE)下所有已下载的模块 zip 包、解压后的源码目录、校验文件(如 .info、.ziphash)。它和项目里的 vendor/ 无关,也不动 go.mod 和 go.sum。
以下场景建议直接运行:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
go list -m all显示的模块版本和go.mod里写的对不上,尤其在 git checkout 切换分支后 - 遇到
invalid version: unknown revision,但远程 tag 确实存在 - 启用了私有
GOPROXY却报checksum mismatch,说明本地缓存校验数据和代理返回不一致 -
$GOPATH/pkg/mod占用超 10GB,而项目实际依赖不到 50 个模块
GoLand 自动构建会悄悄往 $GOCACHE 写东西
GoLand 默认开启 “Build project automatically”,每次保存就触发 go list 和 go build 检查,间接往 $GOCACHE 写缓存。这不是必须的,尤其你主要靠终端跑 go run 或 dlv debug 时:
- 关掉 Settings → Go → Build Tags & Vendoring → Build project automatically
- Settings → Tools → File Watchers → 关掉所有与 Go 相关的 watcher
- 检查 Settings → Go → Language Server →
build.ignore配置项,填bin/,pkg/,target/可避免语义分析误扫构建产物 - 别手动
rm -rf $GOPATH/pkg—— 它可能残留锁文件,且现代 Go(1.10+)主要用$GOCACHE,删错地方反而让下次构建更慢
定期清理不能只靠记忆,得自动化
手动执行 go clean -cache 和 go clean -modcache 容易漏,尤其在多项目开发中。实用做法:
- 加到 shell alias:在
~/.zshrc里写alias goclean='go clean -cache && go clean -modcache',然后source ~/.zshrc,日常输入goclean一步到位 - CI/CD 流水线中,在
go build前加go clean -modcache,避免跨构建污染(注意:首次构建会变慢) - 监控磁盘:用
du -sh $GOCACHE和du -sh $GOMODCACHE定期看大小,超过 5GB 就该清了 - 不要设
GOCACHE=off一劳永逸 —— 它会让每次构建都变慢,只在临时调试机或 CI 中按需启用
最常被忽略的一点:go clean -cache 和 go clean -modcache 是两个独立动作,清完一个不代表另一个也干净了;$GOCACHE 影响构建速度,$GOMODCACHE 影响依赖一致性,二者都得盯住。










