深度分析 Go 在 AI Agent 开发中的优势(并发、部署、性能),引发社区关于语言选择的广泛讨论。
各位,把你们的 Agent 都叫过来吧,我来告诉你为什么 Go 是最适合它们的语言。
过去 8 年里,我一直在专业工作中使用 Go。我想在这里谈谈,为什么 Go 是最适合与 AI Agent 配合开发的语言。
过去 10 多年里,我在工作中使用过 PHP、Go、JavaScript 和 Python。我的职业生涯大部分时间都在构建 Web 服务;而过去几年,我一直在开发 Bruin——它主要是一个用 Go 编写的 CLI 工具。
Bruin 是一个开源 ETL 工具。你们有些人可能知道,数据生态非常喜欢(或者说曾经喜欢?)用 Python 构建工具。Python 有大量现成的库,数据从业者也熟悉 Python,因此项目更容易获得社区贡献;与 Go 开发者相比,Python 开发者也更容易招聘。开始构建 Bruin 时,我们必须做出一个决定:CLI 应该用 Go 开发,还是用 Python 开发?
在做决定之前,我们需要考虑几项约束:
Bruin 是一个数据编排工具,这意味着会有大量任务需要并发运行。
Bruin 需要与许多不同的系统交互,例如语言 runtime 或数据平台的外部 API;因此,我们需要选择一种拥有成熟生态的语言。
Bruin 必须足够快。它是一个 CLI 工具,我们希望把它作为后端,与 VS Code 扩展、本地 UI 等各种系统配合使用,因此它必须具备足够好的性能。
Bruin 需要为所有必须集成的不同系统提供可预测的错误处理路径,并向用户明确说明错误。
Bruin 会运行在用户自己的机器上,这意味着它应该能够轻松支持不同的操作系统和硬件架构。
除了这些约束,还有一个更加主观的条件:在相当长的一段时间里,我会是项目的主要贡献者,所以它必须使用一种我喜欢的语言。对于一个构建大型项目的小团队来说,快乐和精力是最稀缺的资源之一。我认为,自己不能对团队采用的技术栈心生厌恶,这一点至关重要。
最终,我们决定选择 Go。它满足了许多要求。虽然与 Python 相比,Go 在某些数据相关任务上存在缺少库等不足,但它满足了最重要的条件:我真的很喜欢使用 Go。这份快乐让我在 Agent 尚未出现之前,就贡献了数千行代码,也支撑着我们走过了很长一段时间。我内心有一部分担心,选择 Go 可能是一个战略错误,因为我们不得不从头构建很多东西;然而,我的直觉告诉我,从长远来看,Go 相对于 Python 在速度和 DX(开发者体验)上的优势会给我们带来更多收益。
我当时完全没有想到 Agent 会成为现实,但我相信,当 Agent 真正出现时,我们当初的直觉让自己幸运地站在了一个相当有利的位置。接下来,我想谈谈使用 AI Agent 编写软件时 Go 所具备的一些优势,以及为什么我认为 Go 是当今最适合 Agent 的语言。
Agent 会吐出海量代码。无论你是否认为它们在这方面称得上智能,它们都能生成非常可信、看起来通常没有问题的代码。第一个挑战也由此而来:我们如何确保它们生成的代码真的可以运行?
最简单的保障方式之一,就是使用编译型语言。强类型也好,静态类型也好——我总是把它们弄混——这类机制能够让 AI Agent 不断迭代自己生成的代码,直到它在一定程度上是正确的。这并不意味着代码真正完成了预期任务,只意味着代码排除了某一类错误,例如使用了错误的类型或参数。代码能够通过编译,就代表至少按照这门语言的标准,生成的代码在语法上是正确的。
编译型语言已经存在了很长时间,但像 Go 这样的高级编程语言并不多。显然还有 Rust,但 Rust 与 Go 有着截然不同的特性和目标使用场景。对于 AI Agent,我认为 Go 胜过 Rust:
Go 的语法和概念比 Rust 更简单。
Go 的类型系统不像 Rust 那么复杂,这使生成的代码更容易贴近一套公认的惯用写法,也更容易被人类理解。
Go 的编译速度比 Rust 更快,能为 AI Agent 提供更快的反馈循环。
现有的 Go 代码远多于 Rust 代码,因此模型使用 Go 时能够生成比 Rust 更好的代码。
这更多是我的直觉,而不是有真实数据支撑的结论,欢迎大家指正。虽然还有许多其他编译型语言,但从易用性、社区、迭代速度和简洁性来看,Go 显然已经成为其中最突出的一员。
也许这一点本该放在最前面?算了。Go 是一门非常简单的语言。如果你熟悉任何一门编程语言,那么阅读 Go 代码对你来说应该轻而易举。你可以立刻理解代码在做什么,并对其进行推理。这意味着,即使你的 Agent 生成了大量 Go 代码,你仍然应付得来。
另一个优势在于理解设计选择:虽然 Agent 能生成非常优秀的代码,但它们有时会突然采用奇怪的设计方案,然后沿着这条路越走越深。Go 的简洁性在这里非常有帮助,它能让你更容易判断 Agent 正在朝什么方向前进。
话虽如此,我坚定地认为,12 个月后我们可能已经不太需要阅读代码了。因此,也可以提出另一种观点:可读性或简洁性在未来可能不会那么重要——这确实有可能。即便如此,只要我想,我仍然希望自己能够随时进入代码中查看和修改。
这是我喜欢 Go 的原因之一:它是一门立场鲜明的语言,有清晰的规范,也有相应的工具支持这些规范。运行测试、格式化代码或构建二进制文件,都有标准的方式。Go 还有一套独特的错误处理方式,尽管很多人讨厌它。无论你喜不喜欢,Go 至少明确倡导了一套做事方式,让人们更容易写出惯用的 Go 代码,也让许多人和 Agent 可以共同维护这些代码。
以 JavaScript 为例:完成同一件事有十亿种不同的方式。每当我加入一个 JS 项目,都必须先弄清楚它使用了哪些工具、学习这些工具如何工作,并努力熟悉整个项目,然后才能真正开始产出。每个人对于如何格式化代码、如何分发 package,甚至如何在脚本中导入 library,都有不同的看法。坦率地说,我觉得 JS 目前的状态就是一团滚烫的乱麻——不过我扯远了。
Go 避开了这些问题,因此在 AI 生成代码这件事上体现出一项巨大优势:模型根据训练数据中见过的所有代码,知道该如何使用 Go。不同项目中的 Go 代码通常非常相似,而标准化的工具链也让 Agent 能够高效使用它们。
让 Agent 格式化一段 JS 代码,它可能会引入一个新工具,然后尝试让这个工具正常工作。让它对 Go 代码库做同样的事,它只会运行 gofmt,然后任务就完成了。编写单元测试或构建二进制文件也是如此。
如果你编写的软件只会运行在某个特定环境中,这一点可能不会让你产生太大共鸣。但如果你开发的是 CLI 工具,根本无法控制它最终会在哪里运行,那么 Go 就会成为完美的选择。无论是否涉及 AI,这项优势都成立;不过,我认为它与 AI Agent 结合后会产生一种有趣的效果。
跨平台支持是 Go 的一等公民,这意味着在每次代码变更后,跨不同环境运行所有单元测试和集成测试都会变得非常简单。
你知道这意味着什么吗?
你猜对了:这意味着 AI Agent 可以快速验证自己的工作,并确保没有破坏任何现有功能。显然,如果你根本不写测试,这项能力本身也称不上什么优势;但你可以直接在另一个操作系统上运行相同的命令并验证代码,这一点意义重大。
和许多人一样,我们一直在尽可能多地尝试后台 Agent。无论是通过一条 Slack 消息触发 Cursor 处理某项变更,还是把本地 session 移交给远程 session,我们都在逐渐摆脱对代码构建和运行环境的严密控制。
这算是一个小优势,但 Go 的跨平台能力在这里同样十分亮眼:同一份代码可以生成以相同方式运行在 Linux、Windows 或 macOS 上的二进制文件,而且处理 Go 代码的整个流程在不同环境中都是标准化的。这意味着我不在乎不同的 Agent 平台运行在哪里,也不在乎某个 sandbox 提供商能否处理我们的开发依赖;一切都能正常工作。
这项优势很可能也会随着时间推移而消失,但以 2026 年初的情况来看,根据我的个人经验,Agent 有 95% 的概率能够一次生成有效的 Go 代码。对此我完全没有任何数据支持,不过相比 Go,我在使用 Python 时确实遇到了更多困难。模型对相关 library、模式和最佳实践非常熟悉,以至于只要确定了方向,使用 Go 构建一项功能几乎会变得轻而易举。
我认为,这其中一部分原因并不是 Go 拥有大量训练数据;如果单纯取决于训练数据的数量,那么 Python 肯定早就赢了。使用 Go 时,一件事通常只有一种做法,而在 Python 中,同一件事可能有 20 种不同的实现方式。如果比较 Go 与 Python 的训练数据总量,Python 会胜出;但在实践中,真正的比较更像是 Go 的训练数据与 Python 中某个特定 library 的训练数据之间的较量,而在这种情况下,Go 反而会获胜。
我敢肯定,随着模型不断进步,训练数据也纳入越来越多其他语言的示例,例如 Rust,这项优势迟早会消失——如果它还没有消失的话。我也确实缺乏证据来支持这些说法,所以请把这部分更多地当成一种感觉。
我认为,编程语言正在经历一个奇怪的阶段:过去许多我们非常在意的东西,如今似乎已经不再重要。人类亲手编写的代码似乎会越来越少,而我们需要的是能够帮助 Agent 把代码写好的系统。
我觉得纯粹是因为运气,Go 恰好落在了易用性、性能和普及程度三者之间的甜蜜点上,因此非常适合 Agent。它们可以写出漂亮的 Go 代码,可以运行、编译、测试和格式化代码,还能用 Go 交付可在各种机器上使用的高性能软件。今天,任何想构建新工具的人都已经可以享受到这些好处:只要让 Claude Code 用 Go 为你构建一个 CLI,然后靠在椅背上,享受结果就行了。
得益于这些优势,Go 最近为 Bruin 赋予了强大的能力,我们也正在进一步加码 Go。Go 会成为 Agent 的编程语言吗?我不知道。未来会不会出现更适合 Agent 的语言?我也不知道。我只知道,我的效率很高,团队的效率也很高,而且我们能够非常迅速地交付像样的软件。更重要的是,即使有了 Agent,我仍然非常享受使用 Go。
一套使用开源工具构建 AI context layer 的实用框架,把对 AI 数据工程的怀疑转化为真正可行的解决方案,其中包括自愈 pipeline 和团队的渐进式采用。
Bruin 现在已经支持 Model Context Protocol,Cursor、Claude Code 和其他编辑器中的 AI Agent 可以查询数据库、摄取数据、比较数据表并构建 pipeline——整个过程都可以通过自然语言完成。
一份关于如何在 Python 和 SQL 之间做出选择,以完成数据转换任务的实用指南。了解应该在什么情况下使用哪种工具、需要避免哪些常见反模式,以及哪些决策框架真正有效。