Go问答技术文章
-
Go vet 默认只启用高置信度检查,shadow 变量遮蔽分析由 golang.org/x/tools 单独提供。本文解释它没有默认启用的原因、内外层 err 的风险、固定版本运行命令,以及接入 CI 时如何处理误报。392 收藏 -
go vet 的 printf 分析器不是按函数名猜测所有自定义格式函数,而是依赖包装函数推断或显式声明。本文解释自动识别失效的常见边界,并给出 if false 绑定与 -printf.funcs 两种稳妥处理方式。275 收藏 -
解释 Go go vet copylocks 为什么报告复制 Mutex,并用指针接收者、指针参数和按索引遍历修复包含锁的结构体复制问题。262 收藏 -
go test 会把测试实际查询过的环境变量纳入缓存输入。变量值变化,或从未设置变为空字符串,通常都会让下一次测试重新执行;用 gocachetest 可直接看出原因。280 收藏 -
Go test 中 -count=1 会绕过成功测试缓存并实际执行一次;-count=0 则把普通测试、基准和 fuzz seed 的运行次数设为零,不能用来验证测试逻辑。本文对比两者与 (cached)、测试二进制、Examples 和 CI 排查的关系。498 收藏 -
解释 go test 输出 (cached) 的原因,区分测试二进制、命令参数、环境变量和文件输入,并给出 -count=1、GODEBUG=gocachetest=1 与 go clean -testcache 的排查用法。200 收藏 -
Go 模糊测试的时间上限由 go test 的 -fuzztime 控制,既可以按 30s 这样的持续时间设置,也可以按 1000x 这样的迭代次数设置。本文同时区分 -timeout、-fuzzminimizetime 和 -parallel,帮助你把 testing.F 接入本地开发与 CI。345 收藏 -
Go testing.F 找不到失败语料时,先看 testdata/fuzz/FuzzName,再区分只读包回退到 GOCACHE/fuzz 的情况,并用 FuzzName/hash 精确重跑。136 收藏 -
解释 Go 原生 fuzz 测试中 testing.F 入口、testing.T 回调、f.Add 种子与失败语料的职责关系,并给出可运行的 go test 命令。138 收藏 -
解释 Go 表驱动并行测试为什么会读到同一个循环变量,给出 tc := tc 的兼容写法,并区分 Go 1.22 语义、浅复制和共享资源问题。435 收藏 -
解释 Go testing.T.Parallel 为什么要等父测试函数返回,拆解 t.Run、并行栅栏、共享资源和调试检查方法。409 收藏 -
讲清 Go testing.T.Parallel 的暂停边界,示范如何隔离表驱动子测试的切片、map、结果和临时资源,并用 -race 与 -count 排查共享状态污染。197 收藏 -
go test -race 输出的 goroutine 栈不是一条普通调用链。本文按冲突访问栈、goroutine 创建栈和共享数据位置拆解报告,说明如何从函数名与行号回到真正的读写代码,并完成修复复查。359 收藏 -
go test -race 变慢通常是正常的检测成本。本文教你固定比较口径,拆分编译、执行、内存和覆盖率影响,并判断哪些测试值得长期运行 race。473 收藏 -
go test -race 能发现共享变量数据竞争,是因为它在实际运行时记录普通读写,并依据 happens-before 关系判断并发访问是否缺少同步。本文用一个共享计数器说明报告结构,并比较 mutex、channel 与 atomic 的修复边界。322 收藏