强制重跑测试需执行 go clean -testcache,它清除测试结果缓存,使 go test 跳过 cached 状态、真实执行逻辑,包括新添加的 t.Log 或修复的 panic;该命令全局生效、安全且不影响编译缓存。

go test 显示 “cached” 但逻辑已改,怎么强制重跑?
这是 go clean -testcache 最典型的使用场景。Go 的测试结果缓存默认启用,只要 go.mod、源码哈希、构建参数(如 -race)没变,go test 就直接返回 “cached”,不真正执行测试函数——包括你刚改的 t.Log() 或修复的 panic 都不会出现。
常见错误现象:go test -v 输出里只有 ok example.com/pkg 0.001s (cached),没有实际日志;CI 中测试看似通过,实则根本没跑新代码。
-
go clean -testcache只删测试结果缓存,不影响$GOCACHE中的编译产物或$GOMODCACHE中的模块源码 - 该命令无需进入项目目录,全局生效;也不依赖
GO111MODULE设置 - 清理后首次
go test会变慢,但输出变成真实执行过程(含t.Log、失败堆栈等) - 如果用了
go test -fuzz,顺手加go clean -fuzzcache,否则模糊测试种子仍可能复用旧缓存
GoLand 点“Run Test”卡在 “Running…” 不动,是缓存问题吗?
大概率不是缓存,而是 IDE 没触发真正的 go test 流程,或者被后台构建阻塞了。GoLand 默认会复用 go test 的缓存行为,但它卡住更常因以下原因:
- GoLand 正在后台执行
go list或gopls分析,占用文件锁,导致测试进程无法读取$GOCACHE中的编译产物 - 测试中用了
time.Sleep或等待外部服务(如未启动的 Redis),而 GoLand 的测试 runner 默认无超时,就一直挂起 - 启用了
Build project automatically,保存文件瞬间触发构建+测试并发,资源争抢导致卡死 -
go test本身没问题,但 GoLand 的测试配置里勾选了 “Redirect input from file” 却没指定路径,进程阻塞在 stdin 读取
先别急着清缓存:终端里直接运行 go test -v ./... -timeout 30s,看是否能正常结束。如果终端可跑,说明是 GoLand 配置或后台任务干扰,不是缓存脏了。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
清理测试缓存前,要确认哪些关键路径?
go clean -testcache 不需要你手动指定路径,它自动操作 $GOCACHE 下的测试专属子目录(路径类似 $(go env GOCACHE)/test/...)。但如果你怀疑缓存损坏严重,或想验证是否真清掉了,得知道这些:
- 查真实缓存位置:
go env GOCACHE(macOS 默认是$HOME/Library/Caches/go-build) - 测试缓存不单独占目录,它和编译缓存混存在同一
$GOCACHE树里,只是 key 前缀不同;所以go clean -testcache安全,不会误删.a文件 - 如果设了
GOCACHE=off,该命令静默退出,什么也不做——此时测试本就不缓存,卡住必是其他原因 - 不要手动
rm -rf $(go env GOCACHE)/test:部分 Go 版本(如 1.26.0)的测试缓存结构有内部索引,直接删目录可能导致后续go test报invalid test cache entry
为什么清理后测试还是卡?重点检查这三处
真正让 GoLand 测试卡住的,往往不是缓存本身,而是缓存重建过程中暴露的底层问题。清理后首次测试变慢是正常的,但如果持续卡在 “Running…” 超过 10 秒,优先排查:
- 测试函数里有没有没关闭的
http.Server、sql.DB或 goroutine 泄漏?这类问题在缓存命中时被掩盖,重建缓存后首次执行才暴露 - GoLand 的
Settings → Go → Test里是否启用了Parallelize tests?某些依赖全局状态的测试(比如共用一个sync.Map)开启并行后会死锁 - 项目是否用了
//go:build ignore或条件编译标签?go clean -testcache不影响构建标签解析,但若标签配置错,可能导致测试包根本没被识别为可测试目标
缓存只是开关,不是病因。卡住时最有效的动作,永远是终端直跑 go test -v -timeout 10s,看它卡在哪一行——那才是真实瓶颈所在。

















