如何删除AI写的垃圾Go代码 去年年初有人找我帮忙看一个项目。说是“看”其实就是“你帮我们看看这玩意儿还能不能救”。这项目是用 AI 助手写的——不是“AI 辅助”是“AI 全程代笔”。团队挺自豪说程序员负责提需求AI 负责写代码效率拉满。然后我打开了代码库。果然很满。几千行代码全都能编译。全都能通过测试。但有一半左右的函数你根本无法在代码里找到任何调用它们的痕迹。举个例子一个叫processLegacyOrder的函数定义得整整齐齐文档也写了参数也传了返回值也设计了——然后它这辈子都没被叫过。还有个normalizeInputV2后面又出现了V3和V4三个同时存在各自独立演化互不干扰。说实话看到这种情况的第一反应不是“这帮人怎么会写出这种代码”而是“我很清楚这是怎么发生的”AI 助手写了一个函数用了一次然后 refactor 把调用删了。但函数还在因为 AI 不会回头去删“自己写的但不再需要的东西”。它没有“记忆”它只管生成不管清理。编译器不会告诉你什么代码在“装死”Go 的编译器不是侦探是检查员。它能告诉你类型对不对、语法通不通但它不关心某个函数有没有被调用。你写一百个没人调的函数它照样给你编译成功。go vet不会眨眼go build不会抱怨测试会全绿。代码“正确”地躺在那里只是毫无意义。这就是 AI 编程时代的一个“脏秘密”AI 写出了函数然后忘记了。你合并了这些函数然后也忘记了。最后代码库里的“僵尸代码”比活代码还多。一个救了我的工具deadcode在花了一个周末徒手分析哪些函数还活着之后我发现了 Go 团队自己写的一个工具名字很直白就叫deadcode。它干的事很简单从你的程序入口点出发构建整个调用图然后告诉你“这个函数没有任何代码能到达它。”比如你写了这样一段代码packagemainimport(fmtstrings)functoUpper(sstring)string{returnstrings.ToUpper(s)}funcgreet(namestring)string{returnfmt.Sprintf(hello, %s,name)}funcmain(){fmt.Println(greet(world))}toUpper没被调用但它能编译。你猜编译器会不会提醒你不会。运行deadcodego run golang.org/x/tools/cmd/deadcodelatest ./...它直接告诉你main.go:7:6: unreachable: function toUpper is unreachable就这一行。完事。为什么现在这比以前重要得多我后来总结了一下AI 生成的代码里死代码的比例明显更高。不是因为它写得差而是因为它没有长期记忆。一个 AI 生成函数的时候它不知道五分钟前自己已经生成过一个类似的函数也不知道那个函数后来被删掉了。换句话说AI 每次会话都是“第一次见面”。而代码库偏偏是个需要长期记忆的东西。这个问题最麻烦的地方不是技术是认知——你不确定代码库里有 50 个还是 500 个“没用的函数”。你不敢删因为“也许某个地方用到了”。你也不敢留因为它们在消耗你的注意力。那应该怎么办别自己写一个 deadcode 分析器。我干过这件事花了一个周末写 AST 遍历器然后发现go/types跨包分析有多复杂。最后用官方工具一分钟解决。官方工具已经写了直接用。在 CI 里加一步go run golang.org/x/tools/cmd/deadcodelatest ./...。如果发现有死代码让 CI 失败。这样 AI 生成的死代码就不会悄无声息地进主分支。Code Review 的时候多问一句“这个函数谁在用”如果没人用删掉。AI 不会自己清理自己留下的垃圾——但你作为代码的最终负责人有这个能力。说到底AI 写死代码不是 bug是特性——它本来就没有记忆。但你作为最终 push 代码的人有。既然你有就别让它继续装死了。

相关新闻

最新新闻

BeagleV实战:RISC-V开发板跑Linux与NPU端侧AI部署指南

BeagleV实战:RISC-V开发板跑Linux与NPU端侧AI部署指南

拿到BeagleV这块板子的时候,我第一反应其实是“终于等到一个不像开发板的RISC-V开发板了”。以前玩RISC-V基本就是QEMU模拟器、FPGA跑个软核,或者用那种只能点灯的小板子,能真正跑Linux、还能拖着NPU一起用的,BeagleV确实算得上一…

2026/8/28 7:24:45
dfs的排列、子集与组合回溯:从多道题中整理状态差异

dfs的排列、子集与组合回溯:从多道题中整理状态差异

目录 引入:这三类题为什么总被放在一起 一、全排列:顺序不同就是不同答案 二、子集:每个数字只有选或不选 三、子集异或总和:不保存全部子集也能累计答案 四、组合:只向后选择,消除顺序重复 五、组合…

2026/8/28 7:24:45
AI无法处理请求的原因与应对策略

AI无法处理请求的原因与应对策略

抱歉,我无法处理这个请求。

2026/8/28 7:24:45
从BDC代码逆向拆解SAPGUI程序架构:屏幕、模块与数据流

从BDC代码逆向拆解SAPGUI程序架构:屏幕、模块与数据流

1. 项目概述:从BDC代码窥探SAPGUI的骨架刚接触ABAP开发那会儿,我最头疼的就是处理那些通过BDC录屏生成的代码。一堆BDC_CURSOR、BDC_FIELD,还有各种CALL TRANSACTION的参数,看得人眼花缭乱。当时就想,这玩意儿不就是模…

2026/8/28 7:24:45
鹈鹕骑自行车大模型测试(Pelican Bicycle Benchmark)

鹈鹕骑自行车大模型测试(Pelican Bicycle Benchmark)

鹈鹕骑自行车大模型测试(Pelican Bicycle Benchmark)SVG生成基准测试 持续更新评测结果:https://github.com/JoJohanse/pelican-bicycle-benchmark 测试方法 所有模型输入完全相同的提示词:generate an svg of a pelican riding a…

2026/8/28 7:24:45
NumPy核心机制解析:从ndarray到广播与向量化计算

NumPy核心机制解析:从ndarray到广播与向量化计算

1. 为什么说NumPy是Python科学计算的基石?如果你刚开始接触Python数据分析、机器学习或者科学计算,那么“NumPy”这个名字一定会高频出现。很多教程会告诉你“先装NumPy”,但很少会深入解释,为什么偏偏是它,而不是别的…

2026/8/28 7:19:45