go clean -cache 清的是 $gocache 目录下的编译中间产物(主要是 .a 文件),用于加速重复构建,但会因构建参数变化而过期;go clean -modcache 清的是 $gomodcache(默认 $gopath/pkg/mod)中下载的模块 zip、源码及校验数据;go clean -i 仅清理当前目录 main 包安装的二进制及关联 .a 文件,不全局生效。

go clean -cache 清的是什么,为什么改了代码却没生效
它清的是 $GOCACHE 目录下的编译中间产物(主要是 .a 文件),不是源码,也不是模块下载内容。这些文件用于加速重复 go build 和 go test,但会因构建参数变化而“过期”。
- 常见错误现象:
go build突然变慢、改了函数逻辑却仍运行旧结果、切换CGO_ENABLED=0/1后链接失败但无明确报错 - 根本原因:缓存里混了不同构建模式的产物(比如上次用
CGO_ENABLED=0编的,这次用CGO_ENABLED=1构建,链接器找不到 C 符号) - 实操建议:
– 运行go clean -cache即可清理当前$GOCACHE中的过期条目
– 想彻底清空(比如怀疑缓存损坏),执行rm -rf $(go env GOCACHE)/*(注意末尾的/*,别漏掉)
– 若设了GOCACHE=off,该命令直接无效
go clean -modcache 清的是什么,为什么 go list -m all 显示版本对不上
它清的是 $GOMODCACHE(默认为 $GOPATH/pkg/mod),即所有通过 go get 或 go build 自动下载的模块 zip 包、解压后的源码和校验数据。这个目录和 go.sum 绑定,但不主动校验本地文件是否被篡改。
- 常见错误现象:
cannot find module providing package xxx、verifying github.com/xxx: checksum mismatch、go list -m all输出的版本与go.mod不一致 - 关键前提:必须确保
GO111MODULE=on,否则go clean -modcache静默不生效 - 实操建议:
– 执行前先确认go env GO111MODULE输出是on
– 不要在 CI 发布前临时执行——清理后首次go build会重新下载所有依赖,耗时不可控
– 若只想删某个模块(如github.com/xxx@v1.2.3),可手动rm -rf $(go env GOPATH)/pkg/mod/github.com/xxx@v1.2.3
go clean -i 为什么删不掉已安装的二进制
go clean -i 只清理「当前目录下 main 包所生成的安装产物」,不是全局删除命令。它删的是 $GOBIN 或 $GOPATH/bin 中对应二进制 + $GOPATH/pkg 下关联的 .a 文件。
- 常见错误现象:在项目根目录执行
go clean -i,但$GOBIN/mytool还在;或切换目录后发现旧二进制仍在运行 - 根本限制:它只识别当前工作目录是否有
main包,且只清理由该包触发的go install结果 - 实操建议:
– cd 进每个cmd/xxx子目录,再单独执行go clean -i
– 想批量清理所有已安装工具,直接rm -f $(go env GOPATH)/bin/*或rm -f $(go env GOBIN)/*更可靠
– 注意:如果用了GOBIN自定义路径,go clean -i仍会按GOBIN路径删,但不会自动处理$GOPATH/bin
彻底卸载 Go 后重装,为什么新环境还是行为异常
残留的环境变量、shell 初始化脚本里的旧路径、IDE 缓存、甚至 $GOMODCACHE 里的旧模块,都会让新 Go “偷偷加载旧逻辑”,这不是安装失败,而是清理不干净。
- 关键检查点:
– 运行which go和go env GOROOT,两者可能指向不同路径(尤其用gvm或 Homebrew 多版本管理时)
– 检查echo $PATH是否含多个 go 相关 bin 路径(如/usr/local/go/bin和~/go/bin并存) - 实操建议:
– macOS 用 Homebrew 安装的,先brew uninstall go,别直接删/usr/local/go
– Ubuntu 用apt装的,执行sudo apt remove --purge golang-go
– 搜索并清理所有 shell 配置文件(~/.zshrc、~/.bashrc、/etc/profile)中含GOROOT=、GOPATH=、PATH=.*go的行
– 清理完务必重启终端或source ~/.zshrc,再运行go env确认GOROOT为空或为自动推导值
go env GOSUMDB 和 IDE 缓存。重装后若仍设为私有 sumdb 或 off,go get 可能跳过校验;VS Code 或 Goland 如果没重启,仍会沿用旧 Go SDK 的缓存索引——这些不会报错,但会让依赖解析和代码跳转出问题。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











