go clean -cache 清 $gocache 下的 .a 编译中间产物,非源码或模块;当修改 cgo 代码、切换 cgo_enabled、变更 goos/goarch 或升级 go 版本时必须执行,否则可能复用过期缓存导致构建异常。

go clean -cache 清什么、什么时候必须清
go clean -cache 删的是 $GOCACHE 目录下的 .a 文件(编译中间产物),不是源码,也不是模块本身。这些文件让 go build 和 go test 跳过重复编译,但一旦你改了 Cgo 代码、切换 CGO_ENABLED、变更 GOOS/GOARCH 或升级 Go 版本,旧缓存就可能被错误复用——导致“改了代码没生效”“链接失败但无报错”“CI 构建结果和本地不一致”。
常见触发场景:
- 从
CGO_ENABLED=0切回1后构建失败 - 在 macOS 上交叉编译 Windows 二进制,第一次成功、第二次静默链接失败
- Go 升级后
go build报 undefined symbol,但函数明明存在
执行前先确认路径:go env GOCACHE(macOS 默认是 $HOME/Library/Caches/go-build)。注意:go clean -cache 不会清空整个目录,只删“过期”条目;要彻底清,得用:rm -rf $(go env GOCACHE)/*(末尾的 /* 别漏)。
go clean -modcache 清模块源码缓存,不是 go.mod
go clean -modcache 删的是 $GOMODCACHE(默认 $GOPATH/pkg/mod)里所有解压后的模块源码、.zip 包和校验数据。它和你在 $GOPATH/src 下手动 git clone 的项目完全无关,也和 go.mod 文件内容无关。
典型误用现象:
-
go list -m all显示的版本和go.mod对不上 -
go mod verify失败但go.sum没报错(说明本地模块源码被意外修改过) - 私有模块代理切换后,构建拉到旧版或损坏的 zip
执行前务必确认 GO111MODULE=on,否则该命令静默无效。清理后首次构建会重新下载所有依赖,耗时不可控——别在发布前临时执行。只想删某个模块?手动删更安全:rm -rf $GOMODCACHE/github.com/xxx@v1.2.3 和 $GOMODCACHE/cache/download/github.com/xxx。
go clean -i 只删当前目录 main 包安装的二进制
go clean -i 的作用范围非常窄:它只清理「由当前目录下 main 包安装的二进制」,不扫描 $GOBIN 或 $GOPATH/bin,也不跨目录生效。比如你在 ~/proj/cmd/mytool 执行 go install 生成了 $GOBIN/mytool,然后 cd ~/proj 运行 go clean -i,它根本不会删 mytool——因为当前目录没有 main 包。
想确保删干净,必须 cd 进每个 cmd/xxx 目录单独执行 go clean -i。另外,go clean -i 不会清理 go run 产生的临时可执行文件(它们在 /tmp 下,名字随机),这类文件得靠系统自动轮转或手动清理。
测试中临时文件怎么清才不漏
测试里用 os.CreateTemp 或 os.MkdirTemp 创建的文件/目录,必须显式清理——Go 不会自动删。很多人写 defer os.Remove(f.Name()) 就以为完事,但以下情况它完全不触发:
-
os.Exit(1)直接终止进程,跳过所有defer - 函数提前
return,某些 error 分支没写defer - goroutine 内部的
defer在主程序退出时不执行 - 变量被重赋值,
defer删除的是空字符串或旧路径
唯一可靠方式是 t.Cleanup:
func TestSomething(t *testing.T) {
tmpfile, _ := os.CreateTemp("", "test-*.txt")
t.Cleanup(func() { os.Remove(tmpfile.Name()) })
dir, _ := os.MkdirTemp("", "test-dir-*")
t.Cleanup(func() { os.RemoveAll(dir) })
}
注意:不要用 os.Remove 删目录(会报 directory not empty),必须用 os.RemoveAll;删前不用 filepath.Abs 校验路径——t.Cleanup 内部已保证安全。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











