<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tony Bai &#187; 技术志</title>
	<atom:link href="http://tonybai.com/category/technical-notes/feed/" rel="self" type="application/rss+xml" />
	<link>https://tonybai.com</link>
	<description>一个程序员的心路历程</description>
	<lastBuildDate>Thu, 28 May 2026 00:19:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>省下 10% CPU！Uber 揭秘 Go 栈扩容的隐秘代价</title>
		<link>https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings/</link>
		<comments>https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings/#comments</comments>
		<pubDate>Thu, 28 May 2026 00:18:21 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AdaptiveStack]]></category>
		<category><![CDATA[Assembly]]></category>
		<category><![CDATA[BimodalDistribution]]></category>
		<category><![CDATA[cloudnative]]></category>
		<category><![CDATA[copystack]]></category>
		<category><![CDATA[CPUCost]]></category>
		<category><![CDATA[CPU开销]]></category>
		<category><![CDATA[EscapeAnalysis]]></category>
		<category><![CDATA[GarbageCollection]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[GODEBUG]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[goroutine]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HighConcurrency]]></category>
		<category><![CDATA[linkname]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[P90]]></category>
		<category><![CDATA[P99]]></category>
		<category><![CDATA[PerformanceOptimization]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[StackExpansion]]></category>
		<category><![CDATA[uber]]></category>
		<category><![CDATA[UnderlyingPrinciples]]></category>
		<category><![CDATA[云原生]]></category>
		<category><![CDATA[双峰分布]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<category><![CDATA[底层原理]]></category>
		<category><![CDATA[微服务]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[栈扩容]]></category>
		<category><![CDATA[汇编]]></category>
		<category><![CDATA[自适应栈]]></category>
		<category><![CDATA[运行时]]></category>
		<category><![CDATA[逃逸分析]]></category>
		<category><![CDATA[高并发]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6366</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings 大家好，我是Tony Bai。 在顶级互联网巨头的底层架构中，性能优化绝不仅仅是写两段优雅的代码，而是一场“刀尖舔血”的硬核战争。 试想一下，如果你的公司拥有超过 200 万个 CPU 核心（Cores），且其中 65% 的微服务完全由 Go 语言驱动，会发生什么？在 Uber 这样的计算体量下，哪怕仅仅提升 1% 的 CPU 效率，每年都能为公司省下数百万美元的真金白银。 最近，Uber 基础架构团队在对核心服务进行性能 Profiling 时，抓出了一个隐藏极深的 CPU “吸血鬼”。这个内鬼既不是复杂的业务逻辑，也不是被千夫所指的垃圾回收（GC），而是 Go 语言引以为傲的并发基石——Goroutine 栈扩容（Stack Expansion）。 在部分核心微服务中，仅仅是栈扩容（runtime.copystack）这一项底层操作，就吞噬了近 10% 的 CPU 资源！而在 Uber 全局 600 多个微服务大盘中，栈拷贝的平均成本也高达 3.9%（作为对比，代价高昂的 GC 平均成本约为 7.3%）。 面对如此惊人的性能黑洞，Uber 的工程师们没有选择向官方妥协。他们直接向 Go 运行时（Runtime）开刀，甚至手撕底层汇编代码，硬生生把这 10% 的 CPU 损耗压到了 0.0047%。不仅如此，他们还将研究成果反哺给 Go 官方社区（Issue [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings">本文永久链接</a> &#8211; https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings</p>
<p>大家好，我是Tony Bai。</p>
<p>在顶级互联网巨头的底层架构中，性能优化绝不仅仅是写两段优雅的代码，而是一场“刀尖舔血”的硬核战争。</p>
<p>试想一下，如果你的公司拥有超过 <strong>200 万个 CPU 核心（Cores）</strong>，且其中 65% 的微服务完全由 Go 语言驱动，会发生什么？在 Uber 这样的计算体量下，哪怕仅仅提升 <strong>1%</strong> 的 CPU 效率，每年都能为公司省下数百万美元的真金白银。</p>
<p>最近，Uber 基础架构团队在对核心服务进行性能 Profiling 时，抓出了一个隐藏极深的 CPU “吸血鬼”。这个内鬼既不是复杂的业务逻辑，也不是被千夫所指的垃圾回收（GC），而是 Go 语言引以为傲的并发基石——<strong>Goroutine 栈扩容（Stack Expansion）</strong>。</p>
<p>在部分核心微服务中，仅仅是栈扩容（runtime.copystack）这一项底层操作，就吞噬了近 <strong>10%</strong> 的 CPU 资源！而在 Uber 全局 600 多个微服务大盘中，栈拷贝的平均成本也高达 3.9%（作为对比，代价高昂的 GC 平均成本约为 7.3%）。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-2.png" alt="" /></p>
<p>面对如此惊人的性能黑洞，Uber 的工程师们没有选择向官方妥协。他们直接向 Go 运行时（Runtime）开刀，甚至手撕底层汇编代码，硬生生把这 10% 的 CPU 损耗压到了 <strong>0.0047%</strong>。不仅如此，他们还将研究成果反哺给 Go 官方社区（Issue #77893），正在推动 Go 语言栈分配机制的历史性进化。</p>
<p>今天，就让我们扒开 Go 运行时的源码，重走一遍 Uber 团队打赢这场性能保卫战的硬核之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-era-software-engineer-algorithm-map-qr.png" alt="" /></p>
<h2>剖析“案发现场”：Go 栈扩容的阿喀琉斯之踵</h2>
<p>熟悉 Go 的开发者都知道，Go 在全球范围内大杀四方的核心武器就是 <strong>Goroutine（协程）</strong>。</p>
<p>为了实现极高的并发密度，Go 语言在设计上做了一个大胆的取舍：与传统的操作系统线程（OS Thread，如 pthread_create 动辄分配 2MB 或 4MB 的初始栈）不同，<strong>一个 Goroutine 的初始栈空间仅仅只有 2KB</strong>。</p>
<p>这种设计的优势是极其明显的：你可以轻松在一台普通机器上拉起数十万甚至上百万个 Goroutine，而不用担心内存溢出（OOM）。但天下没有免费的午餐，如果你的函数调用层级过深，或者在函数内部声明了较大的局部变量，区区 2KB 的栈空间瞬间就会被撑爆。</p>
<p><strong>当 2KB 不够用时，Go 会怎么做？</strong></p>
<p>Uber 团队在博客中深入解释了这一机制：Go 编译器会在每个函数的序言（Prologue）阶段插入一段检查指令，对比当前的栈指针（Stack Pointer）是否超过了阈值。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-3.png" alt="" /><br />
<center>用于演示栈扩展过程的示例汇编代码</center></p>
<p>第 2 行展示了堆栈指针的值。如果该值超过了阈值，程序就会跳转到 runtime.morestack 函数进行处理。</p>
<p>一旦触发 runtime.morestack，Go 运行时会执行以下昂贵的操作：</p>
<ol>
<li>申请一块原栈空间<strong>两倍大（即 4KB）</strong>的新内存。</li>
<li>调用 runtime.copystack，将旧栈的数据原封不动地“拷贝”到新栈中。</li>
<li><strong>极其复杂的一步</strong>：更新旧栈中所有指向局部变量的指针，确保它们指向新栈的正确内存地址。</li>
<li>释放 2KB 的旧栈。</li>
</ol>
<p>如果 4KB 依然不够呢？那就继续分配 8KB、拷贝、释放；再分配 16KB、拷贝、释放……</p>
<p>在 Uber 复杂的微服务链路中（比如处理庞大的 gRPC 请求、复杂的序列化/反序列化中间件），一个请求进来，往往需要数十 KB 的栈空间。这意味着每次请求都会触发多次徒劳无功的“搬家行为”。在峰值流量下，无数个 Goroutine 都在疯狂扩容，最终导致 CPU 算力被海量的内存拷贝白白挥霍。</p>
<h2>为什么 Go 1.19 的“自适应栈”彻底失效了？</h2>
<p>其实，Go 官方早就意识到了这个问题。在 <a href="https://tonybai.com/2022/08/22/some-changes-in-go-1-19">Go 1.19 版本</a>中，官方高调引入了一项优化：<strong>自适应栈大小（Adaptive Stack Size）</strong>。</p>
<p>其设计初衷非常聪明：Go 会在每次垃圾回收（GC）扫描栈时，计算当前所有存活 Goroutine 的<strong>平均栈大小</strong>。如果当前程序的平均栈大小是 16KB，那么接下来新创建的 Goroutine 就会直接以 16KB 启动，完美避开 2KB -> 4KB -> 8KB -> 16KB 的拷贝地狱。</p>
<p>但这套看似完美的机制，在 Uber 真实的业务场景下，却彻底崩溃了。</p>
<p>在向 Go 官方提交的 GitHub Issue #77893 中，Uber 工程师贴出了详细的统计数据。他们发现，微服务中的 Goroutine 栈分布并不是均匀的，而是呈现出典型的<strong>双峰分布（Bimodal Distribution）</strong>：</p>
<ul>
<li><strong>海量的“僵尸”协程</strong>：在 Uber 的任意一个实例中，通常会有数千个长时间存活的后台 Goroutine。比如监听配置更新的轮询、阻塞在网络 I/O 上的长连接、或是空闲的 gRPC worker。这些 Goroutine 存活了极长的时间（超过 190 分钟），但它们的栈极浅，通常只有 2KB 到 4KB。</li>
<li><strong>少数的“重装”协程</strong>：真正在干活的、处理活跃请求的 Goroutine 数量相对较少，但一旦被触发，它们的栈会迅速膨胀到 16KB 甚至 32KB 以上。</li>
</ul>
<p>悲剧就此诞生。由于海量的“僵尸协程”疯狂拉低了全局平均值，导致 Go 运行时计算出的平均栈大小永远在 4KB 左右徘徊。结果就是，那些真正需要处理复杂业务的新请求，依然只能以 4KB 悲惨开局，继续遭受 copystack 的毒打。</p>
<h2>寻找解药：为什么常规优化方案行不通？</h2>
<p>在明确了病因后，Uber 团队开始探索解决方案。</p>
<p><strong>选择 1：Goroutine 池化（Goroutine Pooling）</strong></p>
<p>这是很多高并发框架爱用的伎俩。Uber 内部的 M3 团队就曾使用过这个方案——让一堆固定数量的 Goroutine 常驻内存，任务来了就丢给它们执行。因为常驻协程已经扩容到了最大栈，所以不会再发生拷贝。</p>
<p><strong>放弃原因</strong>：这需要对全公司的业务代码进行伤筋动骨的重构。协程池不仅增加了代码复杂度，还引入了 Channel 通信的额外 CPU 开销。如果在高负载下任务堆积，还容易导致系统死锁。</p>
<p><strong>选择 2：手动摸石头过河（Manual Mode）</strong></p>
<p>运维人员手动改代码，给服务分配 4KB 的初始栈，部署上去看 Profile；不行再改成 8KB，再部署……</p>
<p><strong>放弃原因</strong>：完全不可扩展。Uber 有上千个微服务，靠人力试错无异于天方夜谭。</p>
<p>常规手段全部碰壁，Uber 的基础架构狂人们决定直接向 Go 运行时的底层规则发起挑战。</p>
<h2>暴力美学：用黑魔法强改 Go 运行时变量</h2>
<p>既然运行时的全局平均算法被后台“僵尸任务”带偏了，那我们就强行接管它！</p>
<p>然而，Go 官方并没有提供任何可以修改初始栈大小的公共 API（这是被隐藏在 runtime 包内部的机制）。为了打破这层封印，Uber 工程师动用了 Go 语言的终极黑魔法：//go:linkname。</p>
<p>通过 go:linkname 这个编译器指令，Uber 成功绕过了包的可见性限制，强行将自己写的外部函数链接到了 runtime 内部的私有变量上。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-4.png" alt="" /></p>
<p>同时，通过GODEBUG关闭了官方的自适应扩容和栈收缩逻辑（debug.gcshrinkstackoff = 1）。</p>
<p><strong>这里还有一个插曲</strong>：由于滥用 linkname 会破坏语言的安全性，Go 官方在 Go 1.23 版本中严格限制了这一机制的使用。为了维持这个 Hack，Uber 甚至被迫在内部维护了一个对 Go 语言源码的 Patch（补丁），专门放开对 startingStackSize 变量的链接权限。</p>
<p>通过这一通硬核魔改，他们成功为不同的微服务通过配置下发（Runtime Environment Variables）注入了静态的初始栈大小。</p>
<p><strong>这套暴力魔改的效果，堪称震撼：</strong></p>
<p>当他们将某个核心请求链路的初始栈静态固定为 <strong>32KB</strong> 后：</p>
<ul>
<li><strong>CPU 吸血鬼被秒杀</strong>：runtime.copystack 的耗时从惊人的 39.98 秒（9.77%）垂直暴跌至 <strong>0.42 秒（0.0047%）</strong>。</li>
<li><strong>整体算力大减负</strong>：整个容器的 CPU 实际消耗量直接<strong>下降了近 16%</strong>。</li>
</ul>
<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-5.png" alt="" /></p>
<p>从图中可见：部署了 32KB 静态栈补丁后，黄线（上周）与绿线（本周）的对比，CPU 使用率出现了明显的下降。</p>
<p>代价是什么？仅仅是容器多占用了不到 200MB 的物理内存（对于拥有 16GB 内存的微服务节点来说，这不到 2% 的内存开销简直是白送）。这就是系统级工程中典型的<strong>“空间换时间”</strong>神之一手。</p>
<h2>全局扩展：自研汇编解析器，实现智能化预测</h2>
<p>让一个服务吃上 32KB 很容易，但如何自动化地推断 Uber 旗下数百个微服务究竟需要多大的栈？</p>
<p>Uber 团队给出了一份教科书级别的“自动化性能反馈回路（Feedback Loop）”方案：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings-6.png" alt="" /></p>
<p>Uber 设计的自动化调整架构。从生产环境拉取 Profile -> 筛选出触发扩容的函数 -> 获取带符号表的二进制文件 -> 逆向反汇编计算栈大小 -> 将最优配置下发给微服务。</p>
<p>这里的技术难点在于：Profile 只能告诉你哪个函数触发了扩容，但它没法告诉你这个函数到底需要多大的内存。</p>
<p><strong>Uber 的做法简直硬核到了极点：反汇编（Disassembly）。</strong></p>
<p>他们编写了一个自动化工具，使用 Go 原生的 debug/elf 库解析带有符号表的二进制文件，找到那个罪魁祸首的函数，然后直接读取它的底层汇编指令！</p>
<p>在 x86 汇编中，函数在进入时会通过减小栈指针寄存器（RSP）来分配当前函数所需的栈帧空间。指令通常长这样：SUB $128, RSP。<br />
Uber 的分析器精准地捕获这条指令，提取出立即数（比如 128 字节），然后沿着 Profile 的调用栈层层累加，最终极其精确地计算出这棵调用树在最深处到底需要多少物理内存！</p>
<p>通过这种“开天眼”般的方式，Uber 为每一个微服务量身定制了最完美的 2的次幂（如 8KB、16KB、32KB）作为静态启动栈，消灭了全公司的大部分的栈扩容内耗。</p>
<h2>反哺开源：推动 Go 语言社区的历史性进化</h2>
<p>Uber 并没有将这个每年能省下数百万美元的黑科技据为己有。</p>
<p>在验证了方案的巨大威力后，Uber 工程师带着详尽的生产级数据，敲开了 Go 官方 GitHub 的大门（Issue #77893），期望从语言底层寻找一种更优雅、无需魔改代码的终极解法。</p>
<p>这引起了 Go 核心开发团队（如 Keith Randall, thepudds）的高度重视。针对 Uber 揭示的“双峰分布”导致平均值失效的痛点，社区目前正在紧锣密鼓地测试几项革命性的补丁（如 CL 758141, CL 764220）：</p>
<ol>
<li><strong>剔除“僵尸”协程（Filtering Inactive Goroutines）</strong>：在计算全局平均栈大小时，直接把那些在过去一两个 GC 周期内完全没动过、一直阻塞在 Select 或 I/O 上的长时协程排除在数学公式之外。</li>
<li><strong>放弃平均值，改用 P90 算法</strong>：不再使用易被极端值影响的平均数（Mean），转而追踪所有新销毁协程栈大小的 P75 或 P90 分位数。</li>
<li><strong>内存阈值保护</strong>：为了防止盲目分配导致 OOM，Go 可能会引入一个软上限：只要预测的较大初始栈带来的额外内存开销，不超过程序总堆（Heap）大小的 1%，就允许新协程以更大的姿态启动。</li>
</ol>
<p>Uber 工程师在他们的基础服务中测试了 Go 官方仍在 WIP（开发中）的“P90 + 剔除僵尸协程”补丁。结果令人振奋：<strong>在不写一行魔改代码的情况下，服务的 copystack 成本自动下降了高达 80%！</strong></p>
<p>不出意外的话，在即将到来的 Go 新版本中，全球数以百万计的 Go 开发者，都将免费享受到由 Uber 趟出的这条性能优化之路。</p>
<h2>小结：给高阶开发者的三个启示</h2>
<p>从 Uber 这次优化战役中，我们应当汲取到系统级优化的深刻智慧：</p>
<ol>
<li><strong>没有永恒的银弹（No Silver Bullet）</strong>：Go 的 2KB 极轻量级并发机制让它在网络编程中大杀四方，但在重度计算和深层中间件调用的微服务中，初始内存过小反而成了 CPU 杀手。理解底层的 tradeoff（空间换时间）是每一位高阶架构师的必修课。</li>
<li><strong>让 Profiling 成为上帝之眼</strong>：如果 Uber 没有建立起常态化、Fleet-wide的 CPU Profiling 机制，这 10% 的算力损耗将永远隐藏在数据中心的嗡嗡作响中，无人知晓。性能优化，永远是数据驱动的。</li>
<li><strong>敬畏底层，但也敢于重塑底层</strong>：遇到语言层面的严重瓶颈，平庸的工程师会说“官方机制就是这样，没办法”；但顶级的极客会直接打开源码，用 go:linkname 强行逆天改命，手撕机器汇编，最后再拿着硬核数据去推动官方修改世界规则。</li>
</ol>
<p>技术的世界里永远没有绝对的黑盒，有的只是一次又一次在极限边缘的疯狂试探。今天，Uber 帮全球的 Go 开发者点亮了一盏明灯，而在不远的未来，这束光将照亮我们运行在云端的每一行代码。</p>
<p>资料链接：</p>
<ul>
<li>https://www.uber.com/us/en/blog/zero-growth-stack</li>
<li>https://github.com/golang/go/issues/77893</li>
</ul>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/28/uber-reveals-hidden-cost-of-go-stack-growth-10-percent-cpu-savings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从 Go 迁移到 Rust</title>
		<link>https://tonybai.com/2026/05/27/migrate-go-to-rust/</link>
		<comments>https://tonybai.com/2026/05/27/migrate-go-to-rust/#comments</comments>
		<pubDate>Tue, 26 May 2026 22:22:44 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AsyncProgramming]]></category>
		<category><![CDATA[BackendDevelopment]]></category>
		<category><![CDATA[BorrowChecker]]></category>
		<category><![CDATA[cargo]]></category>
		<category><![CDATA[CompilationSpeed]]></category>
		<category><![CDATA[ConcurrencyModel]]></category>
		<category><![CDATA[DeveloperExperience]]></category>
		<category><![CDATA[EngineeringTradeoffs]]></category>
		<category><![CDATA[ErrorHandling]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[Interface]]></category>
		<category><![CDATA[MatthiasEndler]]></category>
		<category><![CDATA[MemorySafety]]></category>
		<category><![CDATA[ownership]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[StaticCompilation]]></category>
		<category><![CDATA[SupplyChainSecurity]]></category>
		<category><![CDATA[Trait]]></category>
		<category><![CDATA[traits]]></category>
		<category><![CDATA[ZerocostAbstraction]]></category>
		<category><![CDATA[供应链安全]]></category>
		<category><![CDATA[借用检查器]]></category>
		<category><![CDATA[内存安全]]></category>
		<category><![CDATA[后端开发]]></category>
		<category><![CDATA[工程权衡]]></category>
		<category><![CDATA[并发模型]]></category>
		<category><![CDATA[开发体验]]></category>
		<category><![CDATA[异步编程]]></category>
		<category><![CDATA[所有权]]></category>
		<category><![CDATA[接口]]></category>
		<category><![CDATA[泛型]]></category>
		<category><![CDATA[编译速度]]></category>
		<category><![CDATA[运行时]]></category>
		<category><![CDATA[错误处理]]></category>
		<category><![CDATA[零成本抽象]]></category>
		<category><![CDATA[静态编译]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6362</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/27/migrate-go-to-rust 大家好，我是Tony Bai。 在现代后端系统编程领域，Go 和 Rust 无疑是最耀眼的两大双子星。它们都拥有静态类型、编译型、单二进制文件分发等优异特性。然而，这两门语言在底层的设计哲学、运行时权衡以及开发者体验上，走向了截然不同的方向。 Matthias Endler（Corrode 咨询公司创始人）撰写的《从 Go 迁移到 Rust》（Migrating from Go to Rust）是近年来系统编程领域极具深度的一篇迁移指南。作为在生产环境中同时大规模部署过 Go 和 Rust 系统的资深架构师，Matthias 并没有陷入单纯的“谁比谁快”的无意义争论，而是从正确性保证、运行时权衡、工程重构成本等多个维度，客观地为准备进行语言迁移的团队提供了一份极其务实的工程路线图。 以下是该迁移指南的完整简体中文译文，以及技术社区对于此文的精彩技术辩论与观点。 在我协助团队进行的所有迁移中，从 Go 到 Rust 的迁移是一个特例。 这并不是“Rust 会更快吗？”或“Go 是否拥有类型系统？”的问题，因为 Go 在这些方面已经做得很好了。这里的讨论主要围绕正确性保证、运行时权衡以及开发人员体验展开。 在开始之前，先做一个简短的免责声明：本指南高度侧重于后端。后端服务是 Go 的强项所在——小巧的静态二进制文件、专注于网络连接的标准库，以及用于 HTTP 服务器、gRPC、数据库等的庞大生态系统。 这也是大多数考虑使用 Rust 的团队的来源（至少是那些联系我的团队），因此我认为这是在实践中最有用的对比。如果你正在编写命令行工具（CLI）、嵌入式固件或游戏引擎，本文中的一些内容仍然适用，但老实说，我恐怕这不是最适合你的资源。 作为背景，我之前曾写过关于 Go 和 Rust 对比的文章，比如 2017 年的《Go vs Rust？选择 Go》，以及后来与 Shuttle 团队合作撰写的《Go [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/migrate-go-to-rust-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/27/migrate-go-to-rust">本文永久链接</a> &#8211; https://tonybai.com/2026/05/27/migrate-go-to-rust</p>
<p>大家好，我是Tony Bai。</p>
<p>在现代后端系统编程领域，Go 和 Rust 无疑是最耀眼的两大双子星。它们都拥有静态类型、编译型、单二进制文件分发等优异特性。然而，这两门语言在底层的设计哲学、运行时权衡以及开发者体验上，走向了截然不同的方向。</p>
<p>Matthias Endler（Corrode 咨询公司创始人）撰写的《<a href="https://corrode.dev/learn/migration-guides/go-to-rust/">从 Go 迁移到 Rust</a>》（Migrating from Go to Rust）是近年来系统编程领域极具深度的一篇迁移指南。作为在生产环境中同时大规模部署过 Go 和 Rust 系统的资深架构师，Matthias 并没有陷入单纯的“谁比谁快”的无意义争论，而是从<strong>正确性保证、运行时权衡、工程重构成本</strong>等多个维度，客观地为准备进行语言迁移的团队提供了一份极其务实的工程路线图。</p>
<p>以下是该迁移指南的完整简体中文译文，以及技术社区对于此文的精彩技术辩论与观点。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/go-network-programming-complete-guide-pr.png" alt="" /></p>
<hr />
<p>在我协助团队进行的所有迁移中，从 Go 到 Rust 的迁移是一个特例。</p>
<p>这并不是“Rust 会更快吗？”或“Go 是否拥有类型系统？”的问题，因为 Go 在这些方面已经做得很好了。这里的讨论主要围绕<strong>正确性保证</strong>、<strong>运行时权衡</strong>以及<strong>开发人员体验</strong>展开。</p>
<p>在开始之前，先做一个简短的免责声明：本指南<strong>高度侧重于后端</strong>。后端服务是 Go 的强项所在——小巧的静态二进制文件、专注于网络连接的标准库，以及用于 HTTP 服务器、gRPC、数据库等的庞大生态系统。</p>
<p>这也是大多数考虑使用 Rust 的团队的来源（至少是那些联系我的团队），因此我认为这是在实践中最有用的对比。如果你正在编写命令行工具（CLI）、嵌入式固件或游戏引擎，本文中的一些内容仍然适用，但老实说，我恐怕这不是最适合你的资源。</p>
<p>作为背景，我之前曾写过关于 Go 和 Rust 对比的文章，比如 2017 年的《<a href="https://endler.dev/2017/go-vs-rust/">Go vs Rust？选择 Go</a>》，以及后来与 Shuttle 团队合作撰写的《<a href="https://www.shuttle.dev/blog/2023/09/27/rust-vs-go-comparison">Go vs Rust：实操对比</a>》，后者通过一个小型后端服务展示了两种语言的具体差异。</p>
<p><strong>你将在本文中学到什么</strong></p>
<blockquote>
<ul>
<li>Go 与 Rust 的重叠点和分歧点。</li>
<li>Go 的模式如何映射到 Rust。</li>
<li>你能从借用检查器中获得什么。</li>
<li>我在什么情况下会建议人们保留 Go，以及在什么情况下 Rust 值得进行迁移。</li>
<li>如何渐进式地迁移 Go 服务。</li>
</ul>
</blockquote>
<h2>我的背景与立场</h2>
<p>坦白说：我不是 Go 的粉丝。我认为它是一门<strong>设计糟糕</strong>的语言，尽管它非常成功。它<a href="https://tonybai.com/2025/09/04/simple-is-not-easy">混淆了简单性（simplicity）与易用性（easiness）</a>，并且它的几个核心设计折中——无处不在的 nil、作为纪律规则而非类型的错误处理、长期缺失的泛型——都将设计引向了我所不认同的方向。尽管如此，成功才是硬道理！Go 已经捕获了庞大且持久的活跃开发者份额，在 JetBrains 开发者生态系统调查中一直维持在 17-19% 左右。Rust 正在稳步增长，但目前仍然只占一小部分：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/migrate-go-to-rust-2.png" alt="" /><br />
<center>图：2017-2024 年开发者中 Go 和 Rust 的使用情况</center></p>
<p>Go 显然对很多人都非常适用，而一个假装其不适用的指南是毫无帮助的。因此，在这份指南中，我将尽最大努力保持客观，而不是去重新争论那些老问题。但你应该了解我的先验立场，以便进行校准。</p>
<p>另一个值得披露的前提是：我运行着一家 Rust 咨询公司；所以，我当然是有偏见的！更多人使用 Rust 对我的业务是有利的。但我也在专业领域中使用过这两门语言，并曾将 Go 服务推向生产环境。</p>
<p>本指南适用于那些希望诚实对比迁移到 Rust 时会有什么变化的 Go 开发者。</p>
<p>如果想看一个故意持相反立场的观点，我推荐阅读 <a href="https://blainsmith.com/articles/just-fucking-use-go/">Blain Smith 的《就用 Go语言好了，别他妈的废话了！》（Just Fucking Use Go）</a>。在脑海中同时保留这两种观点，比只持其中一种更有用。</p>
<p>如果你更喜欢观看视频而不是阅读，这里有一段来自 The Primeagen 对上述 Shuttle 文章的视频阅读和点评：</p>
<p><em>(视频：<a href="https://www.youtube.com/watch?v=dSoP7EF2YJ4">Rust vs Go: Hands On Comparison</a>)</em></p>
<h2>初看最重要的命令</h2>
<p>Go 开发者已经拥有了行业内最干净的工具链之一。在很久以前，它就开启了“自带电池（batteries included）”式工具链的潮流，为你提供了一个单一、一致的界面，用于构建、测试、格式化、lint 和管理依赖项。我很高兴 Rust 也效仿了这种做法，因为这是一个极好的模式。这是我最喜欢的这两个生态系统的部分之一。</p>
<p>cargo 甚至拥有更多内置功能：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/migrate-go-to-rust-3.png" alt="" /></p>
<p>最大的区别在于，在 Go 中你通常需要借助第三方工具（golangci-lint、mockgen、air、goreleaser）来填补空白。而在 Rust 中，原生(第一方)生态系统开箱即用的功能要丰富得多。有些需要外部 crate 的工具（例如 cargo watch、cargo nextest）只需一个命令即可完成安装并开始使用，例如运行 cargo install cargo-nextest 即可立即获得 cargo nextest。</p>
<p>两个社区在格式化工具上都达成了相同的共识：一个单一的、规范的风格，即使不是完美的，也远比在琐碎的争论（bikeshedding）上浪费时间要好。</p>
<blockquote>
<p>“Gofmt 的风格不是任何人的最爱，但 gofmt 却是每个人的最爱。”</p>
<p>— Rob Pike, <em>Go Proverbs</em></p>
</blockquote>
<p>对于 rustfmt 也是如此；并非每个人都喜欢它的每个细节，但代码评审中不再存在关于代码风格的争端，远比偶尔遇到你不喜欢的格式化偏好要有价值得多。</p>
<h2>Go 与 Rust 的关键差异</h2>
<p><img src="https://tonybai.com/wp-content/uploads/2026/migrate-go-to-rust-4.png" alt="" /></p>
<p>核心结论是，Go 和 Rust 都是编译型、静态类型、单二进制文件部署、具有强大并发能力的语言。不同之处在于<strong>编译器向你保证了什么</strong>，以及<strong>你对运行时行为拥有多少控制力</strong>。</p>
<p>在深入探讨之前，有一个概念框架很有帮助：<strong>当你从 Go 迁移到 Rust 时，大部分变化都会被推入类型系统。</strong> 空值处理、错误传播、数据竞争、资源生命周期、取消机制、泛型，这些在 Go 中要么依赖运行时规范、工具链（go vet、errcheck、golangci-lint、-race），要么依赖运行时的自觉性。而 Rust 则将它们编码为类型，以便编译器在编译时强制执行。</p>
<p>常见的反对意见是这带来了“更多的认知负荷”。我不认同这种说法。我认为，这其实是将认知负荷从你由于必须记住规则而产生的焦虑中释放出来，转移到了编译器身上。一旦你内化了这种模式，并发现它在代码中无处不在（Option、Result、&amp;mut T、Send/Sync、RAII 守卫），Rust 就会停止让你感到沉重，并开始感觉编译器正在为你做你以前必须在大脑中做的工作。</p>
<h2>为什么 Go 开发者会考虑 Rust</h2>
<p>Go 开发者通常不会因为 Go “太慢”而转向 Rust。对于大多数后端工作负载，Go 已经足够快了。人们普遍是对 Go 的一些由于设计不严密而产生的问题感到沮丧：nil 指针带来的隐患、段错误（segmentation faults）的风险、缺乏泛型（长期以来）或任何更复杂的类型系统特性（如枚举和强大的 trait），以及标准库中存在一些怪异的缺失，例如缺少一个内置的 Set 类型（惯用的替代方案是 map[T]struct{}，它在实践中行得通，但感觉类型系统并没有真正起到作用）。</p>
<h3>生产环境中的 nil panics</h3>
<p>你部署了一个 Go 服务，它运行得很好，持续了几个月。然后，某条代码路径被执行，而其中有人忘记检查某个指针是否为 nil，导致 goroutine 崩溃。一个常见的例子是查找操作，它返回零值，或者反序列化后未填充结构体中的某个指针字段：</p>
<pre><code class="go">func (s *Service) Handle(req *Request) error {
    // Find 返回 (*User, error)。如果是 "not found"，error 为 nil；
    // 调用者应该检查 user != nil，但这非常容易被遗漏。
    user, err := s.repo.Find(req.UserID)
    if err != nil {
        return err
    }

    return user.Account.Notify() // 如果 user 为 nil，或 Account 为 nil，则会发生崩溃
}
</code></pre>
<p>Linter 和 IDE 会捕获<em>其中一些</em>情况（通过 nilaway、staticcheck），但它们是选择性开启的、概率性的，而且不能可靠地跨越包边界。Rust 的编译器则根本不允许你忽略这种情况。Rust 的 Option<T> 可以做到：</p>
<pre><code class="rust">fn handle(&amp;self, req: &amp;Request) -&gt; Result&lt;(), ServiceError&gt; {
    let user = self.repo.find(req.user_id)?; // 返回 Option&lt;User&gt;; ? 运算符进行短路处理
    user.notify()
}
</code></pre>
<p>如果没有显式处理 None 的情况，你甚至无法解引用一个 Option。一整类导致 pager-duty（线上紧急警报）事件的事故就这样消失了。</p>
<h3>-race 未能捕获的数据竞争</h3>
<p>go test -race 是一个优秀的工具，但它是一个运行时检测器，意味着它只能找到测试中<em>实际执行</em>到的竞争。在线上高负载下，多个 goroutine 在没有锁的情况下修改同一个 map 会轻松绕过该测试，并导致生产环境崩溃。</p>
<p>在 Rust 中，跨线程共享可变状态需要实现 Send 和 Sync。尝试共享一个普通的 HashMap 并且<strong>程序甚至无法编译</strong>。你被迫将其封装在 Arc&lt;Mutex&lt;&#8230;>> 或 Arc&lt;RwLock&lt;&#8230;>> 中，否则编译器会报错。这样，数据竞争在编译时就成了一个类型错误。</p>
<p>Paul Dix 对于什么促使了 InfluxDB 3.0 的重写非常坦诚，而数据竞争的故事就排在最前面：</p>
<blockquote>
<p>“【最主要的好处是】无畏并发——消除了此前我们从未消除的数据竞争。在 Influx 1.x 版本中，确实存在一些非常棘手的 bug。”</p>
<p>— Paul Dix, InfluxData 创始人兼 CTO，摘自 <em>Rust in Production</em></p>
</blockquote>
<h3>可组合的错误处理</h3>
<p>在 Go 中，你会写：</p>
<pre><code class="go">if err != nil {
    return err
}
</code></pre>
<p>在一两年的开发后，你通常会注意到三件事：</p>
<ol>
<li>样板代码冲淡了你函数的实际业务逻辑。</li>
<li>使用 fmt.Errorf(“doing X: %w”, err) 包装错误是一项纪律要求，而不是编译器强制的规则。这很容易丢失上下文。</li>
<li>通过 errors.Is/errors.As 使用哨兵错误可以工作，但当你忘记处理新变体时，编译器不会提醒你。</li>
</ol>
<p>对反方观点保持诚实也很重要，因为在关于我的 Shuttle 文章的 Lobste.rs 讨论线程中，经验丰富的 Go 开发者指出，errcheck 和 golangci-lint 捕获了绝大多数“忘记处理错误”的情况，并且显式的 if err != nil 比深层嵌套的 ? 链更容易阅读。这两个观点都很中肯，显式风格是一个刻意的文化抉择，而不是一次疏忽：</p>
<blockquote>
<p>“我认为错误处理应该是显式的，这应该是该语言的核心价值。”</p>
<p>— Peter Bourgon, <em>GoTime #91</em>，引用自 Dave Cheney 的 <em>Zen of Go</em></p>
</blockquote>
<p>我的看法是，lint 是一个你必须记住去配置的选择性安全网，而 Rust 的 Result&lt;T, E> 是类型签名本身，无法被遗忘。样板代码与可读性之间的折中是非常真实且见仁见智的。</p>
<p>在 Rust 中：</p>
<pre><code class="rust">#[derive(Debug, thiserror::Error)]
pub enum UserError {
    #[error("user {0} not found")]
    NotFound(UserId),
    #[error("user already exists")]
    AlreadyExists,
    #[error(transparent)]
    Repo(#[from] RepoError),
}

pub fn rename(id: UserId, name: &amp;str) -&gt; Result&lt;User, UserError&gt; {
    let mut user = repo::get(id)?; // ? 自动将 RepoError 转换为 UserError
    user.name = name.to_string();
    Ok(user)
}
</code></pre>
<p>? 运算符处理了错误传播，#[from] 处理了类型转换，而针对 UserError 的 match 是<strong>穷尽检查的</strong>。如果明天你添加一个新的错误变体，编译器会向你展示每一个需要更新的地方。</p>
<h3>不装箱的泛型</h3>
<p>Go 在 1.18 中引入了泛型，它们很有用，但实现上有一些限制（<a href="https://tonybai.com/2026/01/24/go-generics-finally-supports-generic-methods/">不支持类型参数上的方法</a>，<a href="https://time.geekbang.org/column/article/601538">GC shape stenciling</a>，偶尔会有令人失望的性能表现）。Rust 泛型采用单态化（monomorphize），为每个实例生成具有零运行时开销的专门代码。结合 trait，这为你提供了真正的零成本抽象。</p>
<p>这在处理程序（handler）代码中不那么重要，而在共享基础设施（中间件、通用存储库、解码器、解析器）中更重要，在 Go 中，你常常被迫退回到 interface{} / any 外加类型断言。</p>
<h3>可预测的延迟</h3>
<p>Go 的 GC 非常优秀、并发、低停顿，针对典型的服务工作负载进行了很好的调优。但“低停顿”不等于“无停顿”。在重载情况下，P99 延迟尾部明显差于一个不在热路径上分配内存的 Rust 等效程序。</p>
<p>我不会过分夸大这一点，对于绝大多数服务来说，Go 的 GC 根本不是问题。但对于延迟敏感的系统（交易、实时竞价、网络代理、高吞吐量数据摄入），没有 GC 停顿是一个巨大的卖点。Stephen Blum 把它说得很直接：</p>
<blockquote>
<p>“Go 在我们的规模下表现很好，但我们确实需要一些能给我们带来高性价比性能的东西，而 Rust 能够让我们达到那个目标。这就是为什么如今基本上所有的东西都在朝着 Rust 发展的原因。”</p>
<p>— Stephen Blum, PubNub CTO, 摘自 <em>Rust in Production</em></p>
</blockquote>
<hr />
<h2>总结</h2>
<p>Go 像是遭受了千刀万剐（death by a thousand paper cuts）。它是一门非常实用的语言，如果你愿意忽略上述问题，你可以在其中获得极高的生产力。但在达到一定的代码规模后，问题就会开始累积。Go 失去吸引力并没有单一的瞬间，但团队会发现自己渴望更多（更多的安全性、更多的控制、更多的表现力），这就是他们开始寻找替代方案的时候。</p>
<hr />
<h2>Side By Side的对比两种语言</h2>
<p>在 Rust 中感到舒适的最快方法是映射你已经知道的模式。如果要看在两种语言中构建相同后端服务的更长、包含大量代码的完整示例，请参阅 <a href="https://www.shuttle.dev/blog/2023/09/27/rust-vs-go-comparison">Shuttle 对比文章</a>，本节重点介绍最常出现的模式。</p>
<h3>错误处理：if err != nil 对比 Result&lt;T, E></h3>
<p><strong>Go:</strong></p>
<pre><code class="go">func ReadConfig(path string) (*Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("reading config: %w", err)
    }

    var cfg Config
    if err := json.Unmarshal(data, &amp;cfg); err != nil {
        return nil, fmt.Errorf("parsing config: %w", err)
    }

    return &amp;cfg, nil
}
</code></pre>
<p><strong>Rust:</strong></p>
<pre><code class="rust">fn read_config(path: &amp;Path) -&gt; Result&lt;Config, ConfigError&gt; {
    let data = fs::read_to_string(path)?;
    let cfg = serde_json::from_str(&amp;data)?;
    Ok(cfg)
}
</code></pre>
<p>? 运算符替你完成了 if err != nil { return err } 的繁琐工作，如果为 E2 实现了 From<E1>，它还会进行类型转换（这在使用 thiserror 的 #[from] 时是惯用）。</p>
<h3>空值：nil 对比 Option<T></h3>
<p><strong>Go:</strong></p>
<pre><code class="go">func GetUser(id string) *User {
    for _, u := range users {
        if u.ID == id {
            return &amp;u
        }
    }
    return nil
}

u := GetUser("123")
fmt.Println(u.Name) // 如果u 为 nil 则会发生panic
</code></pre>
<p><strong>Rust:</strong></p>
<pre><code class="rust">let user = get_user("123");
println!("{}", user.name); // 编译错误：user 的类型是 Option&lt;User&gt;，而不是 User

// 你必须处理这两种情况：
match get_user("123") {
    Some(u) =&gt; println!("{}", u.name),
    None =&gt; println!("not found"),
}
</code></pre>
<p>在安全的 Rust 中没有 nil。引用不能是空的。指针可以是空的，但你几乎永远不会在应用程序代码中使用裸指针。</p>
<h3>接口 对比 Traits</h3>
<p>Go 的接口是结构化的，一个类型隐式地满足一个接口：</p>
<pre><code class="go">type Reader interface {
    Read(p []byte) (n int, err error)
}
</code></pre>
<p>Rust 的 trait 是标称的，你需要显式地实现它们：</p>
<pre><code class="rust">pub trait Reader {
    fn read(&amp;mut self, buf: &amp;mut [u8]) -&gt; std::io::Result&lt;usize&gt;;
}

impl Reader for MyType {
    fn read(&amp;mut self, buf: &amp;mut [u8]) -&gt; std::io::Result&lt;usize&gt; { /* ... */ }
}
</code></pre>
<p>Go 的风格非常适合临时性的鸭子类型。Rust 的风格非常适合重构和可发现性，你可以用 grep 搜索某个 trait 的每个实现者。</p>
<p>Rust 中与 interface{} / any 最接近的等价物是 Box<dyn Any>，但你几乎永远不会想要它。Go 社区习惯于伸手去拿 interface{}，也是因为：</p>
<blockquote>
<p>“interface{} 什么也没表达。”</p>
<p>— Rob Pike, <em>Go Proverbs</em></p>
</blockquote>
<p>带有 trait 约束的泛型函数（fn handle<R: Reader>(r: R)）涵盖了绝大多数情况，并通过单态化提供无运行时开销。在 Go 1.18 之前，这迫使你退回到 interface{} 加上类型断言，而 Rust 的 trait + 泛型让你能够非常具体。</p>
<p>当你确实需要运行时分发（例如，不同实现者的异构存储）时，你会选择 Box<dyn Trait> 或 Arc<dyn Trait>。这是 Go 中持有 interface 值最直接的 Rust 对应物。</p>
<h3>Goroutines 对比 异步任务</h3>
<p>Go 的并发模型以简单著称：</p>
<pre><code class="go">go doWork(ctx, input)
</code></pre>
<p>Goroutine 很廉价，运行时会在操作系统线程之间调度它们，而通道（chan T）是主要的协同原语。Go 谚语捕获了这一理念：</p>
<blockquote>
<p>“不要通过共享内存来通信；而要通过通信来共享内存。”</p>
<p>— Rob Pike, <em>Go Proverbs</em></p>
</blockquote>
<p>这是 Go 真正大放异彩的地方，并且它对<strong>为什么</strong>非常明确：<strong>在 Go 中，顺序代码和并行代码之间没有语法上的区别</strong>。函数签名、它的调用者，或关于它如何编写的任何内容都毫无二致。没有 async fn，没有 .await，没有执行器可供选择，也没有 Send / Sync 约束。只要你不共享可变状态而不进行同步，顺序代码和并发代码看起来是一样的。</p>
<p>这种属性，即<strong>没有函数着色（function colouring）</strong>，是 Go 相比 Rust 最大的日常生产力优势，而在迁移之后，这也是 Go 开发者最怀念的东西。Lobste.rs 讨论中的几位评论者准确地指出了这一点，他们说得很对。Rust 的 async 更加强大且经过更多检查，但它的显式度也更高，这带来了真正的开发体验成本。</p>
<p>Rust 在执行器（对于后端服务几乎总是 tokio）之上使用 async/await：</p>
<pre><code class="rust">tokio::spawn(async move {
    do_work(input).await;
});
</code></pre>
<p>形式很相似。不同之处在于：</p>
<ul>
<li>Rust 的异步函数返回 Future。除非被 .await 或 spawn，否则它们不会运行。</li>
<li>编译器会跨 .await 点验证 Send/Sync 约束。如果你在跨 .await 期间持有一个非 Send 的值，你会得到一个非常精确的编译器错误，解释其原因。</li>
<li>没有内置的 goroutine 风格的抢占。异步任务中长时间运行的 CPU 工作会使执行器饥饿；你需要将其卸载到 tokio::task::spawn_blocking 或 rayon。</li>
<li>通道（tokio::sync::mpsc、broadcast、watch）是一流的，但存在于库中，而不是语言本身。</li>
</ul>
<p>对于大多数后端代码，日常体验是类似的：启动一个任务，通过通道进行通信，并大方地使用超时。</p>
<h3>context.Context 对比 CancellationToken</h3>
<p>在 Go 中，你将 context.Context 传给每个阻塞调用：</p>
<pre><code class="go">func (s *Service) Fetch(ctx context.Context, id string) (*User, error) {
    return s.client.Get(ctx, "/users/"+id)
}
</code></pre>
<p>Rust 没有内置的 context.Context。最接近取消的等价物是 tokio_util::sync::CancellationToken：</p>
<pre><code class="rust">pub async fn fetch(&amp;self, token: CancellationToken, id: &amp;str) -&gt; Result&lt;User, FetchError&gt; {
    tokio::select! {
        _ = token.cancelled() =&gt; Err(FetchError::Cancelled),
        res = self.client.get(&amp;format!("/users/{}", id)) =&gt; res,
    }
}
</code></pre>
<p>对于超时，tokio::time::timeout(dur, fut) 可以包装任何 future。对于截止时间/值，你通常将它们作为显式参数传递，或者使用 tracing span 而不是单一的上下文对象。</p>
<p>一些 Go 开发者怀念 ctx 的隐式感。但在实践中，显式的 Rust 风格更容易让人推断，因为你总是确切地知道什么是可以取消的，什么是不可以的。更深层次的观点是，<strong>没有任何一种语言可以免费给你取消机制</strong>，只是规约出现在不同的层面上：</p>
<blockquote>
<p>“Go 并没有办法告诉一个 goroutine 退出。没有停止或杀死函数，这是出于充分的理由。如果我们不能命令一个 goroutine 退出，那么我们就必须礼貌地请求它。”</p>
<p>— Dave Cheney, <em>The Zen of Go</em></p>
</blockquote>
<p>在 Go 中，这种“礼貌地请求”是通过约定俗成地在每个调用点传递并检查 context.Context。在 Rust 中，则是 CancellationToken（或 watch 通道）传给每个调用点，但编译器实际上可以在你忘记时提醒你。</p>
<h3>通道</h3>
<p>两种语言都有通道。翻译很直接：</p>
<p><strong>Go:</strong></p>
<pre><code class="go">ch := make(chan int, 10)
go func() {
    ch &lt;- 42
}()
v := &lt;-ch
</code></pre>
<p><strong>Rust:</strong></p>
<pre><code class="rust">let (tx, mut rx) = tokio::sync::mpsc::channel::&lt;i32&gt;(10);
tokio::spawn(async move {
    tx.send(42).await.unwrap();
});
let v = rx.recv().await.unwrap();
</code></pre>
<p>Rust 的通道将发送端（Sender）和接收端（Receiver）区分为不同的类型，这使得所有权和 Send 属性在类型层面是显式的。</p>
<h3>结构体与方法</h3>
<p><strong>Go:</strong></p>
<pre><code class="go">type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}
</code></pre>
<p><strong>Rust:</strong></p>
<pre><code class="rust">pub struct Circle {
    pub radius: f64,
}

impl Circle {
    pub fn area(&amp;self) -&gt; f64 {
        std::f64::consts::PI * self.radius * self.radius
    }
}
</code></pre>
<p>Rust 的 &amp;self 相当于 Go 的值接收者；&amp;mut self 是一个带有修改权限的指针接收者。拥有的 self（消耗该值）在 Go 中没有对应物，但在（类型状态、构建器）模式中偶尔非常有用。</p>
<h3>字符串：string 对比 String 与 &amp;str</h3>
<p>Go 的 string 是一个具有赋值时拷贝语义的 UTF-8 字节切片（头部被复制，底层数据是不可变且共享的）。Rust 将其分为两种类型：</p>
<ul>
<li>String：拥有的、堆分配的、可增长的。相当于你打算修改的 []byte。</li>
<li>&amp;str：借用的视图，指向别人的字符串数据。大部分时间相当于作为 Go 的 string 参数使用。</li>
</ul>
<p>作为一条经验法则，参数中接收 &amp;str，在生成新数据时返回 String。</p>
<pre><code class="rust">fn greet(name: &amp;str) -&gt; String {
    format!("Hello, {name}")
}
</code></pre>
<p>一旦你内化了这一点，这基本上是无痛的。&amp;str 与 String 的划分是 Rust 更广泛的“借用与拥有”模型的一个缩影。</p>
<h2>Go 泛型：太少，太迟</h2>
<p>Go 在 1.18（2022 年 3 月）引入了泛型，在语言出货十三年之后。它们很有用，但由于它们是后期补丁（tacked on），在实践中它们具有大多数你期望从 Rust、Haskell 甚至现代 C++ 获得的泛型系统的<strong>缺点</strong>，却没有任何<strong>优点</strong>。</p>
<p>这是一个很强烈的说法，所以让我来支持它。</p>
<h3>标准库几乎不使用它们</h3>
<p>最明显的信号是，在泛型落地三年后，Go 自己的标准库仍然主要避免使用它们。sort.Slice 仍然接受一个 func(i, j int) bool 闭包，而不是 cmp.Ordered 约束。sync.Map 仍然被类型化为 any / any。除了 slices、maps 和少数组件外，几乎没有它们的身影。</p>
<p>公平地指出，向后兼容性是这里的主要原因：Go 1 的兼容性承诺意味着现有的非泛型 API 无法重构，因此任何泛型版本都必须与其并存（或在新的包中）。但这只是解释的一部分。已经有足够的时间来引入泛型替代方案，而几乎没有出现这一事实表明语言设计者并不倾向于将泛型作为他们使用的主要工具。</p>
<p>将其与 Rust 进行对比，在 Rust 中，泛型从第一天起就渗透到了标准库中：Option<T>、Result&lt;T, E>、Vec<T>、HashMap&lt;K, V>、Iterator、From、Into、AsRef、Borrow，每个集合、每个智能指针。在不使用泛型的情况下，你根本无法写出惯用的 Rust，因为标准库本身就是泛型的。</p>
<p>在 Go 中，泛型是库作者在确实需要时才选择使用的功能。在 Rust 中，它们是构建一切事物的底层基石。</p>
<h3>没有 Trait 系统，只有结构化约束</h3>
<p>Rust 的泛型与 trait 绑定，trait 兼作该语言进行多态、超类、关联类型、毯子实现（blanket impls）和一致性的机制。</p>
<p>Go 的约束只是带有一个额外 ~ 运算符的接口，用于类型集成员资格。这里没有：</p>
<ul>
<li><strong>超类 / 约束继承体系：</strong> 在 Rust 中，你写 trait Ord: Eq + PartialOrd，任何满足 T: Ord 的类型自动满足 Eq 和 PartialOrd。Go 没有等价物；你可以嵌入接口，但约束求解器并不推断关于层次结构的任何信息。</li>
<li><strong>关联类型：</strong> Rust 的 Iterator 有 type Item;，因此 T::Item 是第一等公民，这体现在每个方法的签名中。Go 最接近的等价物是第二个类型参数，这会泄露到每个方法签名中。</li>
<li><strong>毯子实现（Blanket impls）：</strong> 在 Rust 中，impl<T: Display> ToString for T 会自动为每一个实现了 Display 的类型实现 ToString 方法。在 Go 中，没有办法在定义包之外，为一个类型添加方法。</li>
<li><strong>拥有自己类型参数的方法：</strong> 这是一个显式且有文档记录的 Go 缺失功能 (译注：<a href="https://tonybai.com/2026/01/24/go-generics-finally-supports-generic-methods/">Go 1.27将补全泛型方法这一特性</a>)。你不能写 func (s Set[T]) Map[U](f func(T) U) Set[U]。在 Rust 中，泛型方法是家常便饭。</li>
</ul>
<p>实际的后果是，当你的抽象需要不仅仅是一个“适用于任何 T 的函数外加这几个操作”时，Go 就会迫使你退回到 any 以及类型断言、代码生成或运行时反射。</p>
<h3>类型推导止于函数边界</h3>
<p>Rust 使用 Hindley-Milner 风格的推导引擎，可以跨整个表达式传播类型信息，包括跨闭包、迭代器链和 ? 运算符。你经常写：</p>
<pre><code class="rust">let evens: Vec&lt;_&gt; = (0..100).filter(|n| n % 2 == 0).collect();
</code></pre>
<p>而编译器会推断出 _ 是 i32，而 Vec<_> 目标是 Vec<i32>。</p>
<p>Go 的推导要浅得多。它通常可以推断出函数参数的类型，但它不能从返回位置上下文中推断，不能通过泛型构建器跨链推断，并且经常在调用处强制使用显式的类型参数：</p>
<pre><code class="go">result := slices.Collect[int](iter) // 经常需要
</code></pre>
<p>在 Rust 中这是例外；在 Go 中这仍然很常见。</p>
<h3>单态化 对比 GC Shape Stenciling</h3>
<p>泛型没有免费的午餐：你必须要么在编译时买单，要么在运行时买单，要么通过代码膨胀（JIT）买单。C++ 和 Rust 在编译时通过单态化买单。Java 在运行时通过装箱买单。Go 选择了折中路线，采用了 GC 形状模板和字典，这有一篇众所周知的 PlanetScale 文章正好展示了这一点。</p>
<p>Rust 进行单态化：每个 Vec<i32> 和 Vec<String> 都会产生专门的机器代码，具有零运行时开销。泛型代码是快速路径，而退回到 dyn Trait（相当于 Go 的接口分发）是一个深思熟虑的选择，在你需要运行时多态时做出。你要为单态化付出编译时间的代价，这和 C++ 几十年来付出的代价一样，但它们只是针对不同的事情进行了优化。</p>
<h3>它们没有填补类型系统中的漏洞</h3>
<p>这是最让我困扰的部分。</p>
<p>一个好的泛型系统可以<strong>消除</strong>退回到逃生舱口的理由。在 Rust 中，泛型 + trait 消除了你对 Box<dyn Any> 或运行时反射的大部分需求。类型系统变得更强大了。</p>
<p>在 Go 中，泛型并没有消除 any，没有消除 reflect，没有消除代码生成作为诸如 ORM、解码器和 mock 等事物的首选模式。encoding/json 仍在使用反射。database/sql 仍在使用 any。mockgen 仍会生成代码。如果泛型系统能够大放异彩，最应该发挥作用的地方，正是 Go 在 1.18 之前就伸手去拿运行时机制的那些地方。</p>
<p>Go 中的泛型感觉是累加的，只是箱子里的一个新工具，在狭隘的案例中很有用。Rust 中的泛型感觉是基石般的；将它们移去，语言就会崩溃。</p>
<p>这就是区别所在，也是为什么在我的经验中，泛型 Go 代码读起来并不比它取代的基于 interface{} 的代码好；它只是读法不同，有更多标点符号罢了。</p>
<h2>流行的 Go 包及其 Rust 对应物</h2>
<p><img src="https://tonybai.com/wp-content/uploads/2026/migrate-go-to-rust-5.png" alt="" /></p>
<p>如果你已经在 Go 中有了自己的偏好，Rust 生态系统已经趋于相似级别的“默认选择”。对于一个典型的后端服务：axum + sqlx + tokio + tracing + serde + clap 覆盖了你 90% 的需求。</p>
<h2>过渡到 Rust 的关键挑战</h2>
<p>我想坦率地说。从 Go 过来，<a href="https://corrode.dev/blog/flattening-rusts-learning-curve/">你将会碰壁</a>。这堵墙有一个名字。</p>
<h3>借用检查器</h3>
<p>Go 的运行时替你处理内存和别名。Rust 将这个决定推入类型系统。前几个星期你会写出“显然应该工作”的代码，然后编译器会拒绝它。</p>
<p>最常困扰 Go 开发者的模式有：</p>
<ol>
<li><strong>长生命周期引用：</strong> 在 Go 中，你可以很开心地在 map 中持有一个 *User，只要你愿意。在 Rust 中，该借用会在整个生命周期中锁住 map。解决方案通常是克隆（clone），或者缩小借用范围。</li>
<li><strong>自引用结构体：</strong> 在 Go 中很常见（一个结构体同时持有数据和其上的迭代器）。在 Rust 中，这需要 Pin、ouroboros 或重新设计。几乎总是选择：重新设计。</li>
<li><strong>跨 goroutine 共享可变状态：</strong> 在 Go 中你写成：mu sync.Mutex; data map[K]V，而在 Rust 中则变成 Arc&lt;Mutex&lt;HashMap&lt;K, V>>>。稍微啰嗦一些，但经过了更多检查。</li>
<li><strong>从函数返回引用：</strong> 生命周期标注（Lifetime annotations）就此出现。它们并不像其声誉那样糟糕，但对新手来说确实很陌生。</li>
</ol>
<p>在所有的这些规则下，借用检查器确实听起来像一个“守门人”，不断阻碍，并且让人感到沮丧。但是，当你开始使用 Rust 时，不应该带着那样的心态。借用检查器真正揭示了你代码中现有的非常真实、非常微妙的 bug，如果你不解决它们，你的程序就会存在安全问题。因此，每当你从 rustc 得到编译器错误时，请退后一步，问自己以下几个问题：</p>
<ul>
<li>如果一个值<em>被移动</em>（moved）了，之后如果原位置试图再次使用它会发生什么？</li>
<li>如果一个值<em>被共享</em>（shared）了，如果在另一个线程使用它的同时，有一个线程对其进行了修改会发生什么？</li>
<li>如果一个指针<em>被解引用</em>（dereferenced），如果它是空值或悬空指针会发生什么？</li>
<li>当一个值<em>超出作用域</em>（goes out of scope）时，如果其他地方仍然持有的引用正在被使用会发生什么？</li>
</ul>
<p>这就是你需要理解借用检查器的心态。人类在推理内存方面真的很糟糕。我们很容易忘记指针可以为空，忘记旧的引用可以比它们指向的数据存活得更久，忘记多个线程可以同时修改同一块数据。我们倾向于对数据在程序中如何流动有一个“线性”的心理模型，但现实中它更接近于一个具有多条路径和交互的复杂图形。每一个 if 条件都会强制你考虑<em>这两种</em>分支中会发生什么。这正是借用检查器旨在为你做的事情！它强制考虑那些极其罕见但确实存在的、当你觉得可能不会发生但就是发生了的代码路径。</p>
<p>借用检查器其实是一个巨大的解脱。一旦它通过了，你就知道你的内存状态是 100% 连贯的，你可以专注于更高层次的问题。这也就是 Ed Page（clap 的维护者）说的：</p>
<blockquote>
<p>“当你们刚开始接触它时：会感到沮丧。它让我想起了第一次学习编程的感觉，因为它太不一样了。由于借用检查器和生命周期，我不想去处理那些东西——但我被迫去了。”</p>
<p>— Stephen Blum, CTO, PubNub, 摘自 <em>Rustacean Station</em></p>
<p>“&#8230;&#8230;能够专注于更高层次的问题。在我进行自我分析并失败时，它帮助我发现了问题。”</p>
<p>— Ed Page, 摘自 <em>Rustacean Station: clap with Ed Page</em></p>
</blockquote>
<h3>编译时间</h3>
<p>对你的团队保持诚实，Rust 的编译时间相比 Go 的近乎瞬时的编译确实是一个退步。对于中等规模的服务，全新发布构建可能需要几分钟。增量构建和 cargo check 是合理的，并且编译时间在这些年里已经好了很多，但你仍然会感觉到差异。</p>
<p>为了缓解这种情况，在你的编辑循环中使用 cargo check，在项目见效后将其拆分进 workspace 中，并让你自己的 crate 中不要包含过程宏（proc-macro-heavy）重度依赖，这样它们就只在发生变化时才重新编译。请参阅《<a href="https://corrode.dev/blog/tips-for-faster-rust-compile-times/">加速 Rust 编译时间的技巧</a>》以进行更深入的探讨。</p>
<h3>异步着色</h3>
<p>正如《<a href="https://corrode.dev/learn/migration-guides/go-to-rust/#goroutines-vs-async-tasks">Goroutine 对比 异步任务</a>》中所讨论的，Rust 的 async fn / fn 拆分是从 Go 迁移过来时最大的开发体验退步之一。异步 trait 自 Rust 1.75 以来已经稳定，但在将它们与动态分发结合时，仍然存在一些粗糙的边缘，你偶尔需要借助 async-trait crate 来解决。</p>
<h3>某些细分领域中生态系统较小</h3>
<p>Rust 的 crate 生态系统正在增长，并且库在整体上具有很高的质量，但 Go 在一些后端相邻领域具有领先优势：Kubernetes operator、云提供商 SDK、某些特定生态系统的数据库驱动。在做出承诺之前，请花一天时间检查你依赖的库是否具有你愿意使用的 Rust 对应物。我协助的团队经常不得不自己动手实现至少一两个核心库——例如，他们可能需要更新一个废弃的 XML 架构验证 crate，或为较少人知的协议编写自己的客户端。</p>
<h2>集成策略</h2>
<p>你不需要一次性重写所有内容。我听到的每一个成功的 Go 到 Rust 迁移案例都是战术性的，而不是大爆炸式的重写。Microsoft 的 Victor Ciura 总结得很到位：</p>
<blockquote>
<p>“我们并不是疯狂地到处为了好玩而用 Rust 重写一切。我们在做出这些战术性选择，我们会说：好的，这个新组件，如果我们用 Rust 编写会更好。”</p>
<p>— Victor Ciura, 首席工程师, Microsoft, 摘自 <em>Rust in Production</em></p>
</blockquote>
<p>最有效的策略，按照我通常推荐的顺序如下：</p>
<h3>1. 将“开辟热门路径”作为一种服务来提供</h3>
<p>如果你的系统中某个特定服务一直存在各种问题（比如高 CPU 使用率、对延迟敏感，或者经常出现可靠性问题），那么你可以只用 Rust 重新编写这个服务，同时保持与原有 API 的兼容性。这是风险最低的迁移方式。其他用 Go 编写的服务仍然可以通过 HTTP/gRPC 与这个服务进行交互，而无需关心其底层编程语言是什么。Radar 公司的 Jeff Kao 指出，Discord 上的那些成功案例往往能激发团队尝试这种迁移方式的勇气。</p>
<blockquote>
<p>如果你在 Hacker News 上搜索“迁移到 Rust”，第一个搜索结果一定是关于 Discord 从 Go 语言切换到 Rust 的报道。这一消息激励了我们，让我们也想看看自己是否也能做到同样的事情。<br />
  ——Radar 公司的首席技术官 Jeff Kao 谈 Rust 在实际生产环境中的应用</p>
</blockquote>
<h3>2. 更换 Sidecar/Worker 进程</h3>
<p>后台任务、队列消费者、数据摄取管道以及那些依赖 CPU 处理的批量作业，都是绝佳的优化目标。这些任务通常具有明确的输入/输出边界（比如队列或主题），且不会与系统的其他部分共享任何状态信息。</p>
<h3>3. 使用 cgo 是可行的，但过程相当繁琐/麻烦</h3>
<p>可以通过 cgo 在 Go 语言中调用 Rust 代码，关于<a href="https://blog.arcjet.com/calling-rust-ffi-libraries-from-go/">如何操作的详细指南</a>也很容易找到。（如果你需要我提供相关的指南，请随时联系我。）不过，实际上我并不推荐将 Rust 用于后端服务。与“直接创建一个 Rust 服务并将其置于网络调用之后”相比，其构建的复杂性以及 FFI 相关的开销通常会超过其带来的好处。不过，对于库和 CLI 工具来说，使用 Rust 则更为合适。</p>
<h3>4. 网关背后的“绞杀者”模式</h3>
<p>如果你使用了 API 网关或反向代理，就可以将特定的端点指向新的 Rust 服务，而其余部分则继续使用 Go 语言来实现。当某个特定的业务领域（如身份验证、搜索、计费）适合被迁移时，这种做法尤为有效。这种模式通常被称为“绞杀者模式”：新服务会逐渐取代旧服务，最终完全取代它。</p>
<h2>实用的迁移技巧</h2>
<ul>
<li><strong>从一个边界清晰的服务开始。</strong> 不要选择你机群中最核心、部署最多的服务。挑一个与其他系统的契约定义清晰且影响范围较小的服务。</li>
<li><strong>保持相同的 API 契约。</strong> 如果你的 Go 服务暴露了 REST API，你的 Rust 服务也应该如此：相同的路径、相同的 JSON 格式、相同的错误响应。这样迁移对客户端是透明的，你可以通过网关安全地切换流量。</li>
<li><strong>不要逐字翻译习语。</strong> 克制住写“Go 风格 Rust”的冲动。将 if err != nil { return err } 转换为 ?。将 goroutine-per-request 转换为 tokio::spawn。只在真正需要时（axum 会并发地为你处理请求）才使用它们。带有单一方法的接口通常在 Rust 中表现为泛型约束，而不是 Box<dyn Trait>。</li>
<li><strong>将编译器作为结对程序员。</strong> Rust 的编译器错误通常非常有帮助。仔细阅读它们。它们几乎总会告诉你正确的答案。挣扎最久的团队成员通常是将编译器视为敌人而不是合作者的那些人。</li>
<li><strong>尽早投资于培训。</strong> 我经常看到团队试图通过“边做边学”来进行 Rust 迁移。这很少有好的结果。这有点像通过直接去跑马拉松并试图在跑的过程中摸索来为马拉松训练。你可以做到，但这将是极其痛苦的，而且你可能无法坚持到终点。为学习留出一些不被打扰的时间：一场研讨会，一个在线课程，以及在真实代码上进行结对。前期投入在团队流利掌握后会数倍地回报。<em>(顺便说一下，如果你想讨论培训方案，我很乐意聊聊。)</em></li>
</ul>
<h2>保持 Go 语言的优势所在</h2>
<p>并非所有东西都需要被迁移。Go 语言在以下方面表现优异：</p>
<ul>
<li>Kubernetes 原生工具：Operator、controllers、CRD。该生态系统几乎完全由 Go 语言构建而成。</li>
<li>CLI 工具和开发工具：编译速度快、跨平台编译简单、部署便捷。</li>
<li>胶水层服务：包括薄的 API 层、代理(proxy)服务器以及格式转换器。在 Rust 中，编写这些重复性的代码并不值得。</li>
<li>在任何情况下，团队的工作效率都比追求绝对的准确性更为重要。</li>
</ul>
<p>这并非什么小众职位。对于一家能够大规模提供这两种语言服务的公司来说，这一职位的设立显然意味著更重要的意义：</p>
<blockquote>
<p>Go 语言是构建网络服务的绝佳选择。在 Canonical 公司，我们大量使用 Go 语言来开发软件——Juju 就是一个由 Go 语言编写的庞大软件项目。<br />
  ——Canonical 公司工程部副总裁 Jon Seager 谈 Rust 在现实生产环境中的应用</p>
</blockquote>
<p>混合策略其实很不错，也很常见。与我合作的许多团队都会采用这种策略：对于那些“没什么特别要求”的服务，使用 Go 语言来开发；而对于那些需要确保可靠性和性能的服务，则使用 Rust 语言来开发。</p>
<h2>预期的改进/有望取得的提升</h2>
<p>根据工作量的不同，具体数字会有很大差异，因此这些数据仅供参考而已。请不要把它们当作绝对的承诺！不过，以下是我在协助进行从 Go 语言到 Rust 语言的迁移过程中所得到的一些大致数据：</p>
<ul>
<li>CPU 使用率：降低了 20%到 60%。这一效果不如将代码从 Python 转换为 Rust 时那么显著，因为 Go 本身的效率就已经很高了。其优势主要体现在无需进行垃圾回收，以及代码循环的效率更高。</li>
<li>内存占用：减少了 30%到 50%，这主要得益于无需进行垃圾回收操作，以及运行时的开销更低。</li>
<li>P99 延迟方面：Rust 服务的稳定性明显更高。Go 服务则容易出现由垃圾回收引起的延迟波动。不过，自从 Go 语言引入了低延迟垃圾回收机制后，这种情况已经有所改善，但在高负载情况下，两者之间的差异依然存在。</li>
<li>生产环境中的问题：这是各团队最乐于报告的问题类型。那些在测试阶段被发现，但最终还是进入了生产环境的错误类型（如数据竞争、空指针引用、错误处理路径被遗漏等），在 Rust 中根本无法编译通过。在从其他语言切换到 Rust 之后，处理这些问题的过程通常相当繁琐。Andrew Lamb 在 InfluxDB 的重写过程中也详细描述了这种现象。</li>
</ul>
<blockquote>
<p>“我不需要去追踪崩溃，或者某些奇怪的多线程竞争条件，或者其他那些实际上消耗了我之前大部分时间的事情。”</p>
<p>— Andrew Lamb, 软件工程师, InfluxData, 摘自 <em>Rustacean Station: Rebuilding InfluxDB with Rust</em></p>
</blockquote>
<p>说实话，与从 Python 转向 Rust 相比，从 Go 转向 Rust 后，很难实现 10 倍的性能提升。不过，你确实能减少“愚蠢的错误”，降低延迟，同时还能继续使用同一种语言来开发嵌入式系统或进行系统编程。这往往是代码迁移带来的最令人惊喜的副作用：那些原本需要使用不同编程语言的团队，现在可以共享代码了。Rust 几乎可以用于所有类型的开发场景。</p>
<h2>结论</h2>
<p>从 Go 迁移到 Rust 是与从 Python 或 TypeScript 迁移完全不同的一种类型。从 Go 过来，你深知静态类型、编译型语言的好处。所以你并不是在用动态类型或缓慢的运行时去交易。你是在交易 nil，换来一个漏洞更少、更健壮的代码库、更严格的编译器（可在编译时捕获更多错误）。不过，这里有一条更陡峭的学习曲线。</p>
<p>对于<a href="https://corrode.dev/blog/foundational-software/">基础服务</a>（你的组织所依赖的、需要极高可靠性、对你的业务至关重要的服务），这个迁移方式显然是值得的。对于其他服务，Go 仍然是正确的答案。迁移的目的是在最适合的语言中解决对应的问题。</p>
<blockquote>
<p><strong>准备好迈向 Rust 了吗？</strong></p>
<p>我协助后端团队评估、规划并执行 Go 到 Rust 的迁移。无论你需要架构评审、培训，还是协助将关键服务进行移植，让我们聊聊你的需求吧。</p>
</blockquote>
<h2>原文正文到此为止！</h2>
<h2>社区深度观点</h2>
<p>Matthias 的这篇文章<a href="https://news.ycombinator.com/item?id=48259808">在 Hacker News 上也引发了热烈的辩论</a>。支持者、怀疑者、以及拥有多年双语言实战经验的系统架构师们纷纷下场，就 Go 与 Rust 的工业级博弈分享了大量第一手观点。我对其中的核心争议与洞察进行了系统性汇总：</p>
<h3>1. 核心分水岭：你是否需要一个“托管运行时（Managed Runtime）”？</h3>
<p>在 HN 的讨论中，社区普遍赞同的一个终极共识是：<strong>Go 与 Rust 的选择，90% 程度上取决于你是否想要一个托管运行时（垃圾回收，GC）。</strong></p>
<ul>
<li><strong>Go 拥护者认为</strong>：世界上 95% 的应用都是普通的商业业务系统（LOB）。在这类场景下，Go 拥有世界上最优秀的并发 GC。它的高并发开销极小，虽然在 P99 停顿指标上存在微弱的抖动（Jitter），但对于绝大多数企业级 Web 后端而言，这完全可以忽略不计。</li>
<li><strong>Rust 拥护者反驳</strong>：GC 不仅带来时延抖动，更重要的是它占用了额外的内存（通常需要 30%-50% 的额外物理内存作为缓冲来减少 GC 频率）。在超大规模云原生部署中，Rust 消除 GC 后带来的物理内存节省，可以直接转变为服务器账单上极具说服力的“降本增效”数字。</li>
</ul>
<h3>2. 编译速度与迭代效率的残酷现实</h3>
<p>编译速度是 Go 阵营攻击 Rust 最锋利的武器之一。</p>
<ul>
<li><strong>Go 的快</strong>：Go 从设计之初就将编译速度作为核心优先级（由汇编器和简化的类型系统支撑）。在开发中，修改代码到重新运行几乎是“即时”发生的，这带来了极佳的开发体验和迭代速度。</li>
<li><strong>Rust 的痛</strong>：由于采用了复杂的宏系统（Macros）和深度的单态化（Monomorphization）编译期展开，即使是增量编译，Rust 在大型项目中的等待时间依然可能长达数分钟。多位开发者抱怨：<em>“在使用 AI 辅助编程或高频调试时，Rust 漫长的编译等待时间严重降低了开发者的心智流畅度。”</em></li>
</ul>
<h3>3. 错误处理理念的终极碰撞</h3>
<p>在错误处理上，两个阵营各执一词，表现出截然不同的“开发文化”：</p>
<ul>
<li><strong>Go 的显式哲学</strong>：Go 拥护者（包括知名技术领袖 Peter Bourgon）强调，<strong>错误处理应当是显式的，这应该作为语言的核心价值观。</strong> 尽管 if err != nil 冗长，但它逼迫你在每一行可能出错的代码旁停下来，思考当前上下文的应对策略，而不是用一个抽象的 ? 闭着眼睛把错误向上抛出。</li>
<li><strong>Rust 的类型保障</strong>：Rust 拥护者则认为，Go 的显式是一种“依靠肉体纪律维持的低效工程学”。一旦团队规模扩大，总有人会遗漏处理。而 Rust 将错误融入 Result&lt;T, E> 类型签名，由编译器在底层进行<strong>穷尽性校验（Exhaustive checks）</strong>，在代码简洁度（使用 ?）与安全性（不漏掉任何一种分支）之间找到了近乎完美的工程平衡。</li>
</ul>
<h3>4. 生态系统的对比：标准库（Batteries-Included）与模块化 Crates 依赖</h3>
<p>开发者对两门语言的第三方生态设计表现出了明显的温度差：</p>
<ul>
<li><strong>Go 的稳定</strong>：Go 拥护者非常自豪于 Go 极其庞大且强大的核心标准库。你不需要引入任何第三方库，就能用纯标准库写出高可用的 HTTP 服务器、加解密引擎和网络代理。这避免了类似 Node.js 社区的“Dependency Hell（依赖地狱）”和安全供应链攻击风险。</li>
<li><strong>Rust 的模块化</strong>：Rust 的标准库非常克制，甚至连异步运行时（tokio）、序列化（serde）和命令行解析（clap）都是第三方包。一些 Go 开发者迁往 Rust 后表达了这种不适：<em>“在 Rust 里，写个简单的后台服务，一不小心就引入了上百个第三方 Crates，这让人有些缺乏安全感。”</em></li>
</ul>
<h3>5. AI 与 LLM 时代的编码体验</h3>
<p>这是一个极具 2026 年时代特色的前沿议题。讨论区多位开发者分享了在使用大模型（如 Claude Code、Cursor）编写这两门语言时的反差体验：<br />
*   <strong>AI 写的 Rust 质量低下</strong>：由于 Rust 的生命周期（Lifetimes）和借用规则极度精密，AI 经常会生成那些无法通过编译的“幻觉代码”，试图滥用 Mutex、RefCell 等高级特权，或者在多线程中引入生命周期冲突。<br />
*   <strong>但 Rust 拥有最强“安全网”</strong>：然而，反直觉的是，很多开发者表示他们<strong>更喜欢让 AI 写 Rust 而非 Go</strong>。因为如果 AI 写的 Go 逻辑错了（比如漏了 nil 检查或并发读写未加锁），代码依然能完美编译通过，并在生产环境中引发极其隐蔽的线上故障。而在 Rust 中，“只要 AI 写的代码能通过编译器的金睛火眼，我们几乎就可以闭着眼睛放心地把它部署上线。”</p>
<h2>编辑结语：如何选择你的下一张船票？</h2>
<p>Go 和 Rust 的博弈，本质上是<strong>“高带宽易上手的生产效率”</strong>与<strong>“编译期极致安全的正确性承诺”</strong>之间的路线之争。</p>
<p>如果你正在构建一个高速迭代、团队规模庞大、需要快速抢占市场的业务系统，<strong>Go 依然是那张最稳健、最不容易出错且极其务实的船票。</strong></p>
<p>但如果你的系统已经走过了野蛮生长阶段，开始面临极其严苛的 P99 停顿要求、高并发下的内存与 CPU 账单压力，或者是不容许有任何运行时恐慌（Panics）的国防级、金融级系统，<strong>那么正如 Matthias 团队所验证的那样，忍受 Rust 的学习曲线和编译成本，将为你换来长达数年、在睡梦中都无比踏实的“终极安全感”。</strong></p>
<p>资料链接：</p>
<ul>
<li>https://corrode.dev/learn/migration-guides/go-to-rust/</li>
<li>https://news.ycombinator.com/item?id=48259808</li>
</ul>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/27/migrate-go-to-rust/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>悄悄用 Go 重写 AI 基础设施：NVIDIA 的 GPU 云平台为何选择 Go？</title>
		<link>https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure/</link>
		<comments>https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure/#comments</comments>
		<pubDate>Mon, 25 May 2026 23:52:42 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AICR]]></category>
		<category><![CDATA[AIInfrastructure]]></category>
		<category><![CDATA[AIStore]]></category>
		<category><![CDATA[AI基础设施]]></category>
		<category><![CDATA[Autoscaling]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[cloudcomputing]]></category>
		<category><![CDATA[ConfidentialComputing]]></category>
		<category><![CDATA[Containerization]]></category>
		<category><![CDATA[ControlPlane]]></category>
		<category><![CDATA[DistributedStorage]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[GPUCloud]]></category>
		<category><![CDATA[GPU云]]></category>
		<category><![CDATA[HighAvailability]]></category>
		<category><![CDATA[HighConcurrency]]></category>
		<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[JetStream]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[nats]]></category>
		<category><![CDATA[NVCF]]></category>
		<category><![CDATA[NVIDIA]]></category>
		<category><![CDATA[PerformanceOptimization]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[云计算]]></category>
		<category><![CDATA[分布式存储]]></category>
		<category><![CDATA[基础设施]]></category>
		<category><![CDATA[容器化]]></category>
		<category><![CDATA[容器设备接口]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[控制平面]]></category>
		<category><![CDATA[机密计算]]></category>
		<category><![CDATA[自动扩缩容]]></category>
		<category><![CDATA[高可用]]></category>
		<category><![CDATA[高并发]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6357</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure 当大家都在谈论 CUDA、Python 和 AI 框架时，NVIDIA 的工程团队正在悄悄用 Go 构建支撑整个 AI 云平台的底层基础设施。从 GPU 函数平台 NVCF，到 AI 集群运行时 AICR，再到已经有 1.8k Star 的分布式存储 AIStore，Go 语言已经成为 NVIDIA 内部 AI 基础设施的核心技术栈。这不是偶然，而是一个精心设计的技术选型。 大家好，我是Tony Bai。 2026 年 4 月，NVIDIA 悄悄开源了一个 repo：github.com/nvidia/nvcf。 没有大张旗鼓的发布会，没有 Jensen Huang 的皮夹克登场。但如果你打开这个 repo 看一眼语言构成，数字会让你一惊： Go 占比 88.5%。 这不是一个小工具，这是驱动 build.nvidia.com、NVIDIA DGX Cloud 推理服务和全球 GPU 云合作伙伴（CoreWeave、Oracle Cloud 等）整个控制平面的核心平台。 然后你再看 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure">本文永久链接</a> &#8211; https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure</p>
<blockquote>
<p>当大家都在谈论 CUDA、Python 和 AI 框架时，NVIDIA 的工程团队正在悄悄用 Go 构建支撑整个 AI 云平台的底层基础设施。从 GPU 函数平台 NVCF，到 AI 集群运行时 AICR，再到已经有 1.8k Star 的分布式存储 AIStore，Go 语言已经成为 NVIDIA 内部 AI 基础设施的核心技术栈。这不是偶然，而是一个精心设计的技术选型。</p>
</blockquote>
<p>大家好，我是Tony Bai。</p>
<p>2026 年 4 月，NVIDIA 悄悄开源了一个 repo：<a href="https://github.com/nvidia/nvcf">github.com/nvidia/nvcf</a>。</p>
<p>没有大张旗鼓的发布会，没有 Jensen Huang 的皮夹克登场。但如果你打开这个 repo 看一眼语言构成，数字会让你一惊：</p>
<p><strong>Go 占比 88.5%。</strong></p>
<p>这不是一个小工具，这是驱动 build.nvidia.com、NVIDIA DGX Cloud 推理服务和全球 GPU 云合作伙伴（CoreWeave、Oracle Cloud 等）整个控制平面的核心平台。</p>
<p>然后你再看 AICR（AI Cluster Runtime）：<strong>Go 51.1%</strong>。</p>
<p>再看 AIStore（面向 AI 的分布式存储）：<strong>Go 75.2%</strong>，1.8k Star，10,219 次 commit，是一个有深度的系统级项目。</p>
<p>NVIDIA 在用 Go 构建 AI 时代的基础设施。而且这个趋势正在加速。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-engineer-gpu-introduction-course-qr.png" alt="" /></p>
<h2>NVCF：GPU 云函数平台的全面开源</h2>
<h3>它是什么</h3>
<p>NVCF 全称 NVIDIA Cloud Functions，是一个用于部署、管理和运行 GPU 加速工作负载的平台。你可以把它理解为”GPU 版的 AWS Lambda”——但更贴近生产级 AI 推理场景的设计。</p>
<p>你注册一个 Docker 容器或 Helm Chart，指定 GPU 类型，NVCF 负责处理一切：路由、队列、自动扩缩容、多租户隔离。GPU 云合作商在自己的 Kubernetes 集群上运行 NVIDIA Cluster Agent（NVCA），算力接入 NVCF 控制平面。</p>
<p>2026 年 4 月，NVIDIA 以 Apache 2.0 协议开源了整个平台的完整代码，包括控制平面、调用平面、计算平面、CLI、Helm Charts 和数据库迁移脚本——全部在一个 monorepo 里。之前的 NVIDIA/nvidia-cloud-functions 和 NVIDIA/nvcf-go 两个 repo 已归档，这个新 repo 是唯一的真相来源。</p>
<h3>三平面架构：Go 是粘合剂</h3>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure-2.png" alt="" /></p>
<p>NVCF 的整体架构围绕三个独立可扩展的平面展开，通过 <strong>NATS JetStream</strong> 连接。</p>
<p><strong>控制平面（Control Plane）</strong></p>
<p>运行在专用 Kubernetes 集群上，负责函数生命周期管理、自动扩缩容决策和密钥管理。核心服务：</p>
<ul>
<li>function-autoscaler（Rust）：30 秒扩缩容循环，从 VictoriaMetrics 读取利用率，决策写入 Cassandra</li>
<li>helm-reval（<strong>Go</strong>）：在计算平面部署前验证 OCI 引用的 Helm Chart</li>
<li>OpenBao（Apache 2.0 的 Vault fork）：函数密钥静态加密，运行时通过 ess-agent sidecar 注入</li>
<li>Cassandra：持久化状态和自动扩缩容的分布式锁</li>
</ul>
<p><strong>调用平面（Invocation Plane）</strong></p>
<p>所有请求的必经之路，Go 在这里是绝对主角：</p>
<ul>
<li>http-invocation（Rust/Axum）：接收 HTTP/gRPC 请求，发布到 NATS JetStream</li>
<li>llm-gateway（<strong>Go</strong>）：OpenAI 兼容 API，内嵌 Olric 缓存实现 token 感知的速率限制</li>
<li>grpc-proxy（<strong>Go</strong>）：转发 gRPC 调用到函数实例</li>
<li>ratelimiter（<strong>Go</strong>）：使用 Olric 分布式缓存的函数级速率限制</li>
<li>nats-auth-callout（<strong>Go</strong>）：支持 NKey、OIDC 和 Webhook 策略的 NATS 认证</li>
</ul>
<p><strong>计算平面（Compute Plane）</strong></p>
<p>每个 GPU 集群运行一个 NVCA（NVIDIA Cluster Agent）Operator。NVCA 将集群注册到控制平面，消费 NATS 消息，管理 Pod 生命周期。</p>
<h3>一次请求的完整生命周期</h3>
<p>从调用方的 POST /v2/nvcf/pexec/functions/{id} 开始，到响应返回，完整链路如下：</p>
<ol>
<li>http-invocation 检查速率限制（via ratelimiter gRPC）</li>
<li>请求发布到 NATS stream: Create.NVCA.<em>.{clusterID}.</em>.*</li>
<li>NVCA queue manager 消费消息</li>
<li>创建 ICMSRequest Kubernetes CR（通过 NATS sequence 去重）</li>
<li>MiniService controller 协调：创建 Pod 或应用 Helm Chart</li>
<li>函数 Pod 通过 WorkerService gRPC 回连：ConnectOnce</li>
<li>响应返回调用方</li>
<li>完成时：Terminate.NVCA.{clusterID} 触发 Pod 删除和 GC</li>
</ol>
<h3>Scale-to-Zero 的关键设计：NATS 作为持久化请求缓冲区</h3>
<p>NVCF 解决的最有趣的工程问题，是 GPU 工作负载的 Scale-to-Zero。</p>
<p>传统方案（如 Knative）在 Scale-up 期间请求会面临超时压力或重试。对于加载大型模型可能需要数十秒乃至数分钟的 GPU 推理来说，这个问题会非常严重。</p>
<p>NVCF 的解法是把 NATS JetStream 当做一个<strong>持久化请求缓冲区</strong>：</p>
<ol>
<li>自动扩缩容器将期望实例数降为 0，没有 Pod 运行</li>
<li>新请求到达，发布到 NATS JetStream，消息被持久化</li>
<li>自动扩缩容器检测到队列深度 > 0，将期望实例数提升到 1+</li>
<li>NVCA 收到创建消息，启动 Pod</li>
<li>Pod 通过 WorkerService gRPC 连接，拉取缓冲的消息</li>
<li>响应通过一直保持打开状态的 http-invocation 连接返回</li>
</ol>
<p><strong>请求永远不会被丢弃。</strong> 调用方在冷启动时等待更长时间，但请求一定会完成。这是 NATS 持久化消息的直接价值。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure-3.png" alt="" /></p>
<h2>AICR：AI 集群运行时，Go 写的”集群配方书”</h2>
<h3>为什么需要 AICR</h3>
<p>搭建一个 GPU 加速的 Kubernetes 集群是出了名的难。内核版本、驱动、容器运行时、Operator、Kubernetes 版本——任何一个环节的细微差异都可能导致难以诊断的问题，而且极难复现。</p>
<p>这些知识以前只存在于 NVIDIA 内部的验证流水线和运维手册里。<strong>AICR 把这些知识公开了。</strong></p>
<p>项目地址：<a href="https://github.com/NVIDIA/aicr">github.com/NVIDIA/aicr</a></p>
<p>AICR 全称 AI Cluster Runtime，将已知可行的驱动、Operator、内核和系统配置组合，封装成版本锁定的 <strong>Recipe（配方）</strong>——可以被 Helm、ArgoCD 和其他部署框架直接使用的可复现制品。</p>
<h3>核心概念：Recipe 系统</h3>
<p>一个 Recipe 是针对特定环境的版本锁定配置。你描述你的目标（云厂商、GPU 型号、操作系统、工作负载意图），Recipe 引擎将其与一个经过验证的 Overlay 库进行匹配——从基础默认值到云厂商、加速器、操作系统、工作负载特定调优，自底向上分层组合。</p>
<p>每个 AICR Recipe 具备三个特性：</p>
<ul>
<li><strong>Optimized（优化）</strong>：针对特定硬件、云、OS 和工作负载意图调优</li>
<li><strong>Validated（已验证）</strong>：发布前通过自动化约束和兼容性检查</li>
<li><strong>Reproducible（可复现）</strong>：相同输入产生完全一致的部署结果</li>
</ul>
<h3>CLI 展示：五分钟上手</h3>
<pre><code class="bash"># 安装 CLI（Go 编译的单一二进制）
curl -sfL https://raw.githubusercontent.com/NVIDIA/aicr/main/install | bash -s --

# 采集集群当前状态快照
aicr snapshot --output snapshot.yaml

# 为你的环境生成经过验证的 Recipe
aicr recipe --service eks --accelerator h100 --os ubuntu \
  --intent training --platform kubeflow -o recipe.yaml

# 对比 Recipe 与集群实际状态，找出差异
aicr validate --recipe recipe.yaml --snapshot snapshot.yaml

# 渲染为部署就绪的 Helm Charts
aicr bundle --recipe recipe.yaml -o ./bundles
</code></pre>
<p>bundles/ 目录包含按组件分类的 Helm Chart，每个组件附带 values 文件、checksum 和 README。你可以用 helm install 部署，提交到 GitOps 仓库，或使用内置的 ArgoCD 部署器。</p>
<h3>安全供应链：SLSA Level 3</h3>
<p>AICR 在供应链安全上走得很远：SLSA Level 3 可溯源性、签名 SBOM、cosign 镜像证明、每次发布都有 checksum 验证。这已经是不少大型企业对内部工具的要求，NVIDIA 在开源项目里直接做到了。</p>
<h3>技术栈细节</h3>
<p>代码以 Go 为主（51.1%），使用 golangci 做 lint，goreleaser 做发布，ko 做容器镜像构建。项目已经发布了 54 个版本，活跃度很高。目前支持 Amazon EKS、GKE 和 Kind（自管理），GPU 覆盖 H100 和 GB200，工作负载支持 Kubeflow 训练和 Dynamo 推理。</p>
<h2>AIStore：完全用 Go 写的 AI 分布式存储</h2>
<p>如果说 NVCF 和 AICR 还是相对新鲜的项目，那 AIStore 则是一个已经经受了时间考验的系统级工程——<strong>1.8k Star，240 个 Fork，10,219 次 commit，46 位贡献者</strong>。</p>
<p>项目地址：<a href="https://github.com/NVIDIA/aistore">github.com/NVIDIA/aistore</a></p>
<h3>核心定位</h3>
<p>AIStore（AIS）是一个专为 AI 应用构建的轻量分布式存储栈。它是一个弹性集群，可以在运行时扩缩容，支持从单台 Linux 机器到任意规模的裸机集群的任意部署方式。</p>
<p>AIS 的核心差异点：<strong>它能原生操作集群内数据和远程数据，而不是把远程数据当成缓存</strong>。这对 AI 训练工作负载来说是关键区别——你不需要先把 S3 数据拉下来再训练，AIS 可以透明地处理数据层。</p>
<h3>技术亮点一览</h3>
<ul>
<li><strong>多云后端支持</strong>：无缝访问 AWS S3、GCS、Azure、OCI，支持跨账号、跨 endpoint 的同名 bucket 共存。</li>
<li><strong>线性扩展性</strong>：官方博客和 KubeCon 演讲中展示了跨任意数量集群节点的均衡 I/O 分布和线性扩展能力。</li>
<li><strong>ETL Offload</strong>：在数据附近执行 I/O 密集型数据转换，可以内联（作为每次读请求的一部分实时处理）或离线（批量处理，结果写入目标 bucket）。</li>
<li><strong>Get-Batch</strong>：单次调用检索多个对象或归档文件。专为 ML/AI 流水线设计，一次操作获取整个训练批次，按用户指定的顺序组装成 TAR（或其他序列化格式）。这个功能甚至有配套的 <a href="https://arxiv.org/abs/2602.22434">arxiv 论文（2602.22434）</a>。</li>
<li><strong>负载感知节流</strong>：基于多维度负载向量（CPU、内存、磁盘、文件描述符、goroutine）的动态请求节流，保护 AIS 集群在压力下的稳定性。</li>
<li><strong>30+ 批处理操作</strong>：包括 archive、blob-download、copy-bucket、dsort、etl-bucket、lru-eviction、rebalance、rechunk 等，全部可以通过 CLI 启动、监控和控制。</li>
</ul>
<h3>为什么用 Go</h3>
<p>AIStore 75.2% 的代码是 Go，其 Go API 直接被 CLI 和 benchmarking 工具使用。选择 Go 的逻辑很清晰：</p>
<ol>
<li><strong>系统级性能</strong>：Go 的 goroutine 模型天然适合高并发 I/O 密集型工作负载，而分布式存储正是这种场景</li>
<li><strong>单一二进制发布</strong>：CLI 工具和服务端都能编译成静态链接的单一二进制，部署极其简单</li>
<li><strong>生态成熟</strong>：Kubernetes operator、gRPC、NATS、Prometheus——这些基础设施领域的核心库在 Go 生态中都有成熟实现</li>
<li><strong>代码可维护性</strong>：相比 C++，Go 在保持接近底层性能的同时大幅降低了复杂系统的维护成本</li>
</ol>
<h2>为什么是 Go？NVIDIA 的技术选型逻辑</h2>
<p>把这三个项目放在一起看，NVIDIA 选择 Go 的逻辑变得清晰：</p>
<h3>AI 基础设施的特殊需求</h3>
<p>AI 基础设施不同于传统 Web 服务。它需要处理：</p>
<ul>
<li>GPU 资源的精细调度和隔离</li>
<li>大规模并发请求的队列管理</li>
<li>跨多集群的协调</li>
<li>模型文件的海量 I/O</li>
<li>长时间运行的异步任务</li>
</ul>
<p>这些场景对并发模型的要求极高。Go 的 goroutine 和 channel 机制，让工程师可以用清晰的代码表达复杂的并发逻辑，而不需要像 C++ 那样手动管理线程。</p>
<h3>云原生生态的”母语”</h3>
<p>Kubernetes、Docker、containerd、Prometheus、NATS、Helm——云原生基础设施栈几乎是用 Go 写的。NVIDIA 的三个项目全部深度集成 Kubernetes，深度依赖 Operator 模式、Controller Runtime、Helm Chart。选择 Go 意味着可以直接使用这些生态的核心库，而不是跨语言调用的额外复杂度。</p>
<h3>运维友好的单一二进制</h3>
<p>aicr、ais CLI 工具都是 Go 编译的单一静态二进制。在需要快速部署到新集群、在 CI/CD 流水线中运行、或者在边缘节点上操作时，这个特性极其实用。</p>
<h3>Rust + Go 的互补分工</h3>
<p>值得注意的是，NVCF 并不是全 Go。高性能热路径（http-invocation、function-autoscaler）用了 Rust，而控制逻辑、网关、代理、认证——这些需要快速迭代、逻辑清晰的组件——用 Go。</p>
<p>这个分工很有意思：<strong>Rust 负责极致性能的关键路径，Go 负责需要快速演化的系统逻辑</strong>。两种语言各司其职，而不是用一种语言通吃所有场景。</p>
<h2>小结：这意味着什么</h2>
<p><strong>对 Go 开发者</strong></p>
<p>NVIDIA 的这几个 repo 是绝佳的真实世界大型 Go 项目参考：</p>
<ul>
<li><strong>NVCF</strong>：学习 Kubernetes Operator 模式、gRPC、NATS 集成、多平面分布式系统设计</li>
<li><strong>AICR</strong>：学习 CLI 工具设计（goreleaser + cobra）、Helm 生成、GitOps 集成模式</li>
<li><strong>AIStore</strong>：学习高性能分布式系统的 Go 实现，包括内存管理（memsys 包）、分布式一致性、S3 兼容 API 实现</li>
</ul>
<p>这三个项目都是 Apache 2.0 或 MIT 开源，代码质量高，有完整的测试和文档。</p>
<p><strong>对 AI 平台工程师</strong></p>
<p>NVIDIA 正在开源 AI 基础设施的核心组件。NVCF 的开源意味着你可以：<br />
- 在私有 GPU 集群上运行与 NVIDIA 云服务相同的调度和路由逻辑<br />
- 审计每一行代码，而不是把平台当成黑盒<br />
- 修改自动扩缩容逻辑、添加 NATS 认证策略、扩展 MiniService controller</p>
<p>AICR 则给了你一个”NVIDIA 认证”的集群配置参考——如果你正在搭建自管理 GPU 集群，AICR 的 Recipe 系统告诉你什么组合是经过验证的。</p>
<p><strong>对技术决策者</strong></p>
<p>当 NVIDIA——一家以 CUDA C++ 闻名的公司——在 AI 基础设施层面系统性地选择 Go，这个信号足够强烈。Go 已经不只是”Google 的语言”或者”云原生工具链的语言”，它正在成为 AI 时代基础设施的核心技术栈之一。</p>
<p>资料链接：</p>
<ul>
<li>https://blog.kubesimplify.com/nvcf-is-now-open-source-inside-nvidia-s-gpu-function-platform </li>
<li>https://github.com/nvidia/nvcf</li>
<li>https://github.com/NVIDIA/aicr NVIDIA AI Cluster Runtime</li>
<li>https://github.com/NVIDIA/aistore AIStore: scalable storage for AI applications</li>
</ul>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/26/why-nvidia-chose-go-to-rewrite-their-ai-infrastructure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shopify 23,000 名工程师背后的 Claude Code 配置方案（你可以直接复刻的完整配置）</title>
		<link>https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers/</link>
		<comments>https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers/#comments</comments>
		<pubDate>Sat, 23 May 2026 23:15:34 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Agent]]></category>
		<category><![CDATA[AgentManager]]></category>
		<category><![CDATA[AInative]]></category>
		<category><![CDATA[AI原生]]></category>
		<category><![CDATA[AutomatedValidation]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[ClaudeCode]]></category>
		<category><![CDATA[CostControl]]></category>
		<category><![CDATA[DesignSystem]]></category>
		<category><![CDATA[EngineeringPractices]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[ModelContextProtocol]]></category>
		<category><![CDATA[ModelRouting]]></category>
		<category><![CDATA[orchestration]]></category>
		<category><![CDATA[ParallelAgents]]></category>
		<category><![CDATA[ProxyArchitecture]]></category>
		<category><![CDATA[SafetyGuardrails]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Shopify]]></category>
		<category><![CDATA[StrategyFirst]]></category>
		<category><![CDATA[StructuredData]]></category>
		<category><![CDATA[TechnicalDebt]]></category>
		<category><![CDATA[代理架构]]></category>
		<category><![CDATA[大模型]]></category>
		<category><![CDATA[安全护栏]]></category>
		<category><![CDATA[工程实践]]></category>
		<category><![CDATA[并行智能体]]></category>
		<category><![CDATA[成本控制]]></category>
		<category><![CDATA[扩展性]]></category>
		<category><![CDATA[技术债]]></category>
		<category><![CDATA[智能体]]></category>
		<category><![CDATA[智能体经理]]></category>
		<category><![CDATA[模型上下文协议]]></category>
		<category><![CDATA[模型路由]]></category>
		<category><![CDATA[策略优先]]></category>
		<category><![CDATA[结构化数据]]></category>
		<category><![CDATA[编排]]></category>
		<category><![CDATA[自动化]]></category>
		<category><![CDATA[自动化验证]]></category>
		<category><![CDATA[设计系统]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6352</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers 大家好，我是Tony Bai。 这篇来自 X (Twitter) 的深度好文剖析了 Shopify 如何通过 Claude Code 实现工程效率的飞跃。文章不仅分享了其 23,000 名工程师背后的核心配置逻辑，还详细介绍了从并行智能体（Agents）到 MCP 工具包，再到“策略优先”的工作流转型。如果你正在思考如何将 AI 真正集成到团队的开发流水线中，这份来自“未来视角”的 AI 原生工程实践手册（AI-first playbook）绝对值得深入研读与复刻。下面是文章译文全文： Shopify 的 23,000 名工程师正致力于在今年第三季度实现 96% 的代码自动化。 他们同时运行多个 Claude Code 智能体，每个智能体处理代码库的不同部分，而工程师只需进行审查和合并。 Bessemer 发布了他们完整的 AI 优先手册。 以下是他们的确切配置，你可以在 5 分钟内完成复刻。 基础设施层（为什么他们的配置能奏效） Shopify 没有标准化某一个 AI 工具。他们标准化了底层的架构。 他们构建了一个内部 LLM 代理（Proxy），将每一个 AI 请求路由到同一个网关。无论使用 Claude Code、GitHub Copilot 还是 Cursor，它们都流经相同的基础设施。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/shopify-claude-code-configuration-for-23000-engineers-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers">本文永久链接</a> &#8211; https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers</p>
<p>大家好，我是Tony Bai。</p>
<p>这篇来自 X (Twitter) 的<a href="https://x.com/zodchiii/status/2056319284641460626">深度好文</a>剖析了 Shopify 如何通过 Claude Code 实现工程效率的飞跃。文章不仅分享了其 23,000 名工程师背后的核心配置逻辑，还详细介绍了从并行智能体（Agents）到 MCP 工具包，再到“策略优先”的工作流转型。如果你正在思考如何将 AI 真正集成到团队的开发流水线中，这份来自“未来视角”的 AI 原生工程实践手册（AI-first playbook）绝对值得深入研读与复刻。下面是文章译文全文：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<hr />
<p>Shopify 的 23,000 名工程师正致力于在今年第三季度实现 96% 的代码自动化。</p>
<p>他们同时运行多个 Claude Code 智能体，每个智能体处理代码库的不同部分，而工程师只需进行审查和合并。</p>
<p>Bessemer 发布了他们完整的 AI 优先手册。</p>
<p>以下是他们的确切配置，你可以在 5 分钟内完成复刻。</p>
<h2>基础设施层（为什么他们的配置能奏效）</h2>
<p>Shopify 没有标准化某一个 AI 工具。他们标准化了底层的架构。</p>
<p>他们构建了一个内部 LLM 代理（Proxy），将每一个 AI 请求路由到同一个网关。无论使用 Claude Code、GitHub Copilot 还是 Cursor，它们都流经相同的基础设施。</p>
<p><strong>Shopify 的 LLM 代理架构：</strong></p>
<pre><code class="text">工程师 -&gt; Claude Code / Copilot / Cursor
          ↓
      LLM 代理 (集中式网关)
          ↓
      OpenAI / Anthropic / Google 模型
          ↓
      使用分析 + 成本控制 + 模型路由
</code></pre>
<p>这赋予了他们集中式的成本控制、使用分析，以及在不改变任何工程师工作流的情况下更换模型的能力。</p>
<p><strong>给小团队的启示：</strong> 不要只选一个工具就全力投入。先构建基础设施，这样你就可以在保持对成本和数据控制的同时，试验不同的工具。</p>
<hr />
<h2>模式 1：并行智能体，而非单一对话</h2>
<p>Shopify 的资深工程师不会把 Claude Code 当作一个简单的“提问-回答”工具。</p>
<p>他们会同时启动多个智能体，在代码库的不同部分工作。</p>
<p>一个智能体负责重构认证模块。另一个负责编写测试。第三个更新文档。工程师负责审查输出，丢弃无效内容，合并有效内容。</p>
<p><strong>bash 示例：</strong></p>
<pre><code class="bash"># 终端 1：负责重构认证的智能体
claude -p "refactor src/auth/ to use the new session handler"

# 终端 2：负责编写测试的智能体
claude -p "write integration tests for the payment flow"

# 终端 3：负责更新文档的智能体
claude -p "update API documentation for all changed endpoints"
</code></pre>
<p>工程师的工作职责从“写代码”转变为“审查和合并”智能体的输出。Shopify 工程副总裁 Farhan Thawar 将此称为“编排智能系统”。</p>
<h2>模式 2：扩展批判循环 (Extended critique loops)</h2>
<p>并非每个任务都能受益于并行化。对于复杂的架构决策，Shopify 工程师会让单个智能体运行扩展的批判循环。</p>
<p>智能体生成一个答案，评估它，修改它，并在漫长的推理周期中继续精炼。</p>
<p>他们不接受第一次输出，而是强迫智能体自我辩论。</p>
<p><strong>提示词模式：</strong></p>
<blockquote>
<p>“针对 [X] 提出一个架构方案。<br />
  然后批判你自己的提议：在规模化(scaling)时会出现什么问题？<br />
  根据你的批判进行修改。<br />
  再次批判该修订版。<br />
  给出最终版本，并附带每个决策的置信度水平。”</p>
</blockquote>
<p>这种方式产生的结果比单一提示词好得多，因为 Claude 在你发现错误之前就已经抓住了自己的错误。</p>
<h2>模式 3：Shopify AI 工具包 (MCP)</h2>
<p>在 2026 年 4 月，Shopify 发布了一个开源的 MCP (Model Context Protocol) 服务器，将 Claude Code 直接连接到 Shopify 的文档、GraphQL API 模式和在线商店操作。</p>
<p>只需一条命令即可安装：</p>
<pre><code class="bash">claude mcp add --transport stdio shopify-dev-mcp -- npx -y @shopify/dev
</code></pre>
<p>这赋予了 Claude Code 7 种工具：</p>
<ul>
<li>根据实时模式验证 GraphQL 查询</li>
<li>通过 Shopify CLI 执行商店操作</li>
<li>创建产品、管理元字段（metafields）、修改主题</li>
<li>用自然语言运行批量操作</li>
</ul>
<p>如果没有这些，Claude 会产生幻觉、臆造 API 字段或组件模式。有了它，Claude 能够处理真实的平台数据。</p>
<h2>模式 4：CLAUDE.md 作为团队基础设施</h2>
<p>Shopify 不把 CLAUDE.md 视为个人配置，它是提交到 Git 并供 23,000 名工程师共享的团队基础设施。</p>
<p><strong>他们的方案示例：</strong></p>
<pre><code class="markdown"># CLAUDE.md (Shopify internal pattern)

## Stack
Ruby on Rails, React, GraphQL, MySQL

## Commands
- Dev: dev up &amp;&amp; dev server
- Test: dev test [path]
- Lint: dev style
- Type check: bin/srb tc

## Architecture
- app/models/ → ActiveRecord models, business logic
- app/controllers/ → thin controllers, delegate to services
- app/services/ → service objects for complex operations
- app/graphql/ → GraphQL types, mutations, resolvers

## Rules
- NEVER bypass Sorbet type checking
- All new code must have type signatures
- Database queries only through established patterns
- IMPORTANT: run dev test after every change
</code></pre>
<p>来自会议的核心见解：在 CLAUDE.md 中塞入每一个标准和规范会让性能变差，而非变好。你在每一个环节都要为此付出代价。</p>
<h2>模式 5：策略优先的验证</h2>
<p>这是 Shopify 的方法与其他团队最不同的地方。</p>
<p>在 2024 年，工程师将 70% 的时间花在执行（写代码）上，30% 花在策略上。</p>
<p>在 2026 年，Shopify 翻转了这个比例。</p>
<p>因为 AI 处理了大部分编码工作，工程师现在将 70% 的时间花在策略上：映射用户流、验证市场需求、选择正确的架构。只有 30% 的时间花在执行上。</p>
<p><strong>工作流对比：</strong></p>
<ul>
<li><strong>2024 工作流：</strong> 策略: 30% → 执行: 70%</li>
<li><strong>2026 工作流 (Shopify)：</strong> 策略: 70% → 执行: 30%</li>
</ul>
<p>AI 编写代码。人类负责决定代码存在的意义。</p>
<h2>模式 6：带护栏的安全自主性</h2>
<p>Shopify 不会让智能体野蛮生长。他们的Claude Code 护栏设置如下：</p>
<p><strong>json 示例：</strong></p>
<pre><code class="json">{
  "permissions": {
    "allow": [
      "Read", "Glob", "Grep", "LS", "Edit",
      "Bash(dev test *)",
      "Bash(dev style *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git add *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Read(**/.env*)",
      "Bash(git push *)",
      "Bash(dev deploy *)",
      "Bash(bin/rails db:drop *)",
      "Bash(rm -rf *)"
    ],
    "defaultMode": "acceptEdits"
  }
}
</code></pre>
<p>智能体可以读取、编写、测试、重构和提交。它们不能推送到远程仓库、部署到生产环境、删除数据库或读取密钥。</p>
<p>人类在任何不可逆的操作中保持参与。</p>
<h2>你今天就能复刻的配置</h2>
<p>你不需要 23,000 名工程师来使用这些模式。以下是初学者版本：</p>
<ul>
<li><strong>步骤 1：标准化你的 CLAUDE.md</strong><br />
保持在 60 行以内。包含技术栈、命令、架构和规则。提交到 Git，与团队共享。</li>
<li><strong>步骤 2：设置并行智能体</strong><br />
针对大型任务，在独立的终端运行 2-3 个智能体，每个工作在代码库的不同部分。</li>
<li><strong>步骤 3：安装相关的 MCP 服务器</strong><br />
连接你日常使用的工具栈（GitHub, Slack, 数据库等）。</li>
<li><strong>步骤 4：添加护栏</strong><br />
允许：read, write, test, lint, commit。<br />
拒绝：push, deploy, delete, secrets。</li>
<li><strong>步骤 5：翻转比例</strong><br />
停止将 70% 的时间花在执行上。让智能体写代码。把时间花在决定哪些代码应该存在上。</li>
</ul>
<h2>最重要的数字</h2>
<p>Shopify 20% 的生产力提升并非来自编写更多的代码，而是来自探索 10 种方案而非 2 种、更快的原型设计以及捕捉错误。</p>
<p>最能发挥 Claude Code 价值的团队不是那些拥有最强提示词的团队，而是那些构建了基础设施，让智能体能够安全、并行、在真实代码库上工作的团队。</p>
<p><strong>2026 年第三季度实现 90% 的自主编码。</strong> 这不是愿景宣言，而是 23,000 名工程师正在努力达成的最后期限。</p>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>Shopify 提出的 <strong>“70% 策略 + 30% 执行”</strong> 模型，预示着程序员的定义正在发生根本性位移：从“写代码的人”变成“编排智能的人”。</p>
<p>面对这种“AI 自动驾驶”式的开发工作流，我想听听你的看法：</p>
<ol>
<li><strong>你准备好了吗？</strong> 如果明天起 70% 的代码都由 AI 并行完成，你认为自己最核心的“策略价值”会体现在哪里？</li>
<li><strong>最大的担忧是什么？</strong> 是担心代码库变得臃肿无法维护，还是担心初级工程师（Junior）在缺乏“手写代码”锻炼后难以成长？</li>
<li><strong>现状调研：</strong> 你现在的日常工作中，写代码的时间占比是多少？你是否尝试过同时开启多个 AI 窗口为你“打工”？</li>
</ol>
<p>欢迎在评论区分享你的实战心得，我们一起预演 AI 原生时代的工程化未来。</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/24/shopify-claude-code-configuration-for-23000-engineers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google 开源 AX 与 Agent Substrate：构建以 Agent 为核心的云原生计算底座</title>
		<link>https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation/</link>
		<comments>https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation/#comments</comments>
		<pubDate>Fri, 22 May 2026 23:35:05 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AgentExecutor]]></category>
		<category><![CDATA[AgenticWorkflows]]></category>
		<category><![CDATA[AgentRuntime]]></category>
		<category><![CDATA[AgentSubstrate]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[AI智能体]]></category>
		<category><![CDATA[ArchitectureDecoupling]]></category>
		<category><![CDATA[AX]]></category>
		<category><![CDATA[cloudnative]]></category>
		<category><![CDATA[ColdStart]]></category>
		<category><![CDATA[ComputePlane]]></category>
		<category><![CDATA[ConnectionRecovery]]></category>
		<category><![CDATA[DistributedSystems]]></category>
		<category><![CDATA[ExecutionAudit]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[gVisor]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[MicroVM]]></category>
		<category><![CDATA[MultiAgent]]></category>
		<category><![CDATA[PodSnapshots]]></category>
		<category><![CDATA[Pod快照]]></category>
		<category><![CDATA[Sandbox]]></category>
		<category><![CDATA[StateOrchestration]]></category>
		<category><![CDATA[WarmPool]]></category>
		<category><![CDATA[云原生]]></category>
		<category><![CDATA[冷启动]]></category>
		<category><![CDATA[分布式系统]]></category>
		<category><![CDATA[多智能体]]></category>
		<category><![CDATA[安全隔离]]></category>
		<category><![CDATA[应用运行时]]></category>
		<category><![CDATA[执行审计]]></category>
		<category><![CDATA[智能体负载]]></category>
		<category><![CDATA[架构解耦]]></category>
		<category><![CDATA[温水池]]></category>
		<category><![CDATA[状态编排]]></category>
		<category><![CDATA[计算平面]]></category>
		<category><![CDATA[连接恢复]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6347</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation 大家好，我是Tony Bai。 随着大语言模型（LLM）与应用场景的深度融合，AI 正在从单纯的“聊天对话框”快速演进为具备长期运行、自主工具调用和复杂任务编排能力的 AI Agent（智能体）。 在生产环境中，这些 Agent 展现出与传统微服务截然不同的负载特征：它们是高度非线性的、需要频繁执行不可信代码（如动态生成的 Python 脚本）、在等待人类确认（HITL，人类在环）时长期处于闲置状态，同时又会在瞬时产生极其高频的子秒级（Sub-second）工具调用。 传统的容器和虚拟机调度架构（如标准的 Kubernetes）面对这种数以百万计、高密度、长生命周期但又极度高并发的“智能体负载（Agentic Workflows）”时，在隔离安全性、调度时延与算力浪费上面临严重的物理局限。 针对这一工程痛点，Google 在 Google I/O &#8217;26 大会上给出了其深思熟虑的系统级回应。这并非一个单一工具的发布，而是一套分层解耦的云原生 Agent 堆栈的整体亮相。 Google 定义的“三层 Agent 堆栈”，其中包含了： 应用运行时（Agent Runtime）：开源项目 Agent Executor（AX），专注于可靠的状态编排、连接恢复与执行审计。 高密度计算与调度层（Compute Plane）：开源项目 Agent Substrate，专注于海量闲置 Agent 的极速挂起/恢复与去中心化控制平面调度。 安全隔离层（Sandbox Layer）：已正式商用的 GKE Agent Sandbox，基于 gVisor/MicroVM 技术，提供低时延、强隔离的运行沙箱。 本文将拆解这一套以 Agent 为负载单元的新型云原生抽象层，揭示 Google 是如何重新定义大模型时代的分布式系统底座的。 架构解密：从基础设施到应用层的“三层 Agent 堆栈” 要理解这一套复杂的系统，我们需要像拆解传统 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation">本文永久链接</a> &#8211; https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation</p>
<p>大家好，我是Tony Bai。</p>
<p>随着大语言模型（LLM）与应用场景的深度融合，AI 正在从单纯的“聊天对话框”快速演进为具备长期运行、自主工具调用和复杂任务编排能力的 <strong>AI Agent（智能体）</strong>。</p>
<p>在生产环境中，这些 Agent 展现出与传统微服务截然不同的负载特征：它们是高度非线性的、需要频繁执行不可信代码（如动态生成的 Python 脚本）、在等待人类确认（HITL，人类在环）时长期处于闲置状态，同时又会在瞬时产生极其高频的子秒级（Sub-second）工具调用。</p>
<p>传统的容器和虚拟机调度架构（如标准的 Kubernetes）面对这种数以百万计、高密度、长生命周期但又极度高并发的“智能体负载（Agentic Workflows）”时，在隔离安全性、调度时延与算力浪费上面临严重的物理局限。</p>
<p>针对这一工程痛点，Google 在 Google I/O &#8217;26 大会上给出了其深思熟虑的系统级回应。这并非一个单一工具的发布，而是一套<strong>分层解耦的云原生 Agent 堆栈</strong>的整体亮相。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-2.png" alt="" /></p>
<p>Google 定义的“三层 Agent 堆栈”，其中包含了：</p>
<ol>
<li><strong>应用运行时（Agent Runtime）</strong>：开源项目 <strong>Agent Executor（AX）</strong>，专注于可靠的状态编排、连接恢复与执行审计。</li>
<li><strong>高密度计算与调度层（Compute Plane）</strong>：开源项目 <strong>Agent Substrate</strong>，专注于海量闲置 Agent 的极速挂起/恢复与去中心化控制平面调度。</li>
<li><strong>安全隔离层（Sandbox Layer）</strong>：已正式商用的 <strong>GKE Agent Sandbox</strong>，基于 gVisor/MicroVM 技术，提供低时延、强隔离的运行沙箱。</li>
</ol>
<p>本文将拆解这一套以 Agent 为负载单元的新型云原生抽象层，揭示 Google 是如何重新定义大模型时代的分布式系统底座的。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/google-adk-in-action-qr.png" alt="" /></p>
<h2>架构解密：从基础设施到应用层的“三层 Agent 堆栈”</h2>
<p>要理解这一套复杂的系统，我们需要像拆解传统 TCP/IP 协议栈一样，将其自底向上划分为四个物理层级：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-6.png" alt="" /></p>
<p>这种分层解耦的系统设计，标志着 AI 应用开发正式告别了“框架包揽一切”的单体混沌状态，进入了精细化、高可用的系统工程时代。</p>
<h2>底层解局：Agent Substrate 与 Sandbox 是如何解决物理局限的？</h2>
<p>传统的 Kubernetes 是为了支撑长期运行、状态相对稳定的“微服务（Microservices）”而设计的。如果直接将数百万个 Agent 部署为普通的 K8s Pod，系统会迅速面临崩溃：</p>
<ul>
<li><strong>内存与算力浪费</strong>：许多 Agent 处于非激活状态（等待人类输入或调度触发），如果让它们的 Pod 持续在线，会产生天文数字的算力账单。</li>
<li><strong>控制面过载</strong>：数百万个 Agent 产生的子秒级内部工具调用，如果全部经过传统的 K8s API Server 进行调度和授权，会直接导致 K8s 控制平面瘫痪。</li>
<li><strong>安全防线脆弱</strong>：Agent 具有动态执行解释型代码（如本地运行一段临时生成的 Python 来计算数据）的本能，一旦逃逸，将危害宿主机安全。</li>
</ul>
<p>为此，Google 联合 GKE 团队和 Kubernetes 社区，推出了 <strong>Agent Substrate</strong> 与 <strong>Agent Sandbox</strong>：</p>
<h3>1. 基于 gVisor 的强物理隔离（Ironclad Security）</h3>
<p>GKE Agent Sandbox 默认集成了开源的安全容器沙箱 <strong>gVisor</strong>。</p>
<p>它在不可信的 Agent 应用代码与 Linux 内核之间插入了一个名为 Sentry 的用户态内核。所有 Agent 试图执行的系统调用（Syscalls）都会在用户态被拦截、审计并安全执行。这确保了即便 Agent 生成的代码带有恶意，也绝无可能穿透容器逃逸到宿主机上，实现了生产级的“Secure-by-design”。</p>
<h3>2. Pod 快照技术与冷启动消除（Reduce Idle Compute &amp; Low Latency）</h3>
<p>为了消灭 Agent 闲置时的算力浪费，Agent Substrate 引入了 <strong>Pod 快照技术（Pod Snapshots）</strong>：</p>
<ul>
<li><strong>主动挂起（Suspend）</strong>：当一个 Agent 进入休眠或长时等待状态时，Agent Substrate 捕获其完整的运行状态并制作快照，释放其占用的物理 CPU 与内存资源。</li>
<li><strong>瞬时恢复（Resume）</strong>：当事件触发或用户响应时，系统通过集成的 <strong>温水池（Warm Pool）</strong> 技术，利用快照快速恢复运行。</li>
</ul>
<p>根据 Google Cloud 的官方测评，GKE Agent Sandbox 能够在<strong>每秒启动 300 个沙箱</strong>的高并发压力下，保证 <strong>90% 的分配在 200 毫秒内完成</strong>。这几乎抹平了传统安全容器长达数秒的冷启动时延，真正做到了“随用随起，用完即挂”。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-3.png" alt="" /><br />
<center>图：GKE 引入的高性能温水池与 Pod 快照技术</center></p>
<h2>应用层编排：Google AX 如何行使“指挥官”职责？</h2>
<p>在底层的 Agent Substrate 提供了极致的物理隔离与快速调度能力后，位于上层的 <strong>Agent Executor (AX)</strong> 运行时则真正扮演起了“状态与业务编排指挥官”的角色。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-4.png" alt="" /></p>
<p>AX 的核心设计并不是去触碰模型细节，而是通过 <strong>Single-Writer 架构</strong> 和 <strong>Durable Execution（持久化执行）</strong> 来保障 Agentic 循环的绝对可靠：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation-5.png" alt="" /></p>
<h3>1. 轨迹分支（Trajectory Branching）与分支克隆（Forking）</h3>
<p>在复杂决策中，开发者往往希望 Agent 能像写代码一样，在某个关键节点“分叉（Fork）”去尝试多条不同的规划路径，在评估各路径的优劣后再做最终合并。</p>
<p>由于 AX 底层维护了强一致性的持久化事件日志，它原生提供了 <strong>ax fork</strong> 功能：</p>
<pre><code class="bash">ax fork \
  --src-conversation 38460323-9a78-41cb-8991-022b0ff2c19c \
  --dest-conversation e5e26e38-53a2-4f22-b1cb-ae867357df83 \
  --src-seq 12
</code></pre>
<p>开发者可以直接在指定的事件序列号（&#8211;src-seq 12）处，克隆出一条全新的、独立的执行轨迹（Trajectory）。这让 AI 在多路径探索、蒙特卡洛树搜索（MCTS）等高级推理算法中的应用变得异常简单和标准。</p>
<h3>2. 会话一致性（Session Consistency）</h3>
<p>在多客户端并发控制或分布式协作中，多个进程可能同时试图更新同一个 Agent 的会话状态。AX 的单写入者（Single-Writer）架构通过统一的序列号控制机制，彻底避免了因并发竞争（Race Conditions）导致的状态脏写与损坏。</p>
<h2>统一的工程视角：Go 的系统级胶水作用</h2>
<p>如果我们仔细观察这套三层架构，会发现一个极具工程美学的现象：</p>
<ol>
<li>最底层的 <strong>Kubernetes</strong> 与 <strong>GKE Sandbox</strong>：由 Go 语言统治。</li>
<li>中间层的 <strong>Agent Substrate</strong> 与 <strong>AX</strong>：同样是由 Go 语言构建（github.com/google/ax 和 github.com/agent-substrate/substrate）。</li>
<li>最上层的 <strong>Agent 应用与框架</strong>：则可以使用 Python（如 LangChain、ADK）来尽情发挥，当然如果你依然要使用Go，比如adk-go，来开发Agent应用也是非常棒的选择。</li>
</ol>
<p>这一架构再次印证了我们在 AI 系统工程中的理性认知：<strong>运行时底层是系统级工程（System Engineering），应用层是模型算法工程（Algorithm Engineering）。</strong></p>
<p>Go 语言在这里扮演了不可替代的“系统级胶水”角色：它将高密度调度、gRPC 双向流、持久化快照以及隔离沙箱等硬核的系统级原语，封装成极其简单易用的 CLI 和 API，让上层的应用开发者能够专注在 Prompt 与模型逻辑上。</p>
<h2>小结</h2>
<p>在看完 Google 发布的这一套以 Agent 为第一公民的云原生计算底座后，作为软件工程师，我们应该感到无比的兴奋。</p>
<p>大模型确实降低了写业务逻辑代码的门槛，甚至让“AI 自动编程”成为可能。但正如 Google 资深软件工程师 Tim Hockin（Kubernetes 的共同创始人之一）和 Brandon Royal 的联手探索所展示的那样：<strong>如何在大规模、高密度、异构的物理硬件集群中，保障这些 AI 智能体安全、高效、廉价地运转，是一个极其深邃、且刚刚拉开序幕的分布式系统课题。</strong></p>
<ul>
<li>谁来设计高密度的内存挂起与快照算法？</li>
<li>谁来在网络边界保障 gVisor 沙箱的安全网络策略？</li>
<li>谁来在 AX 层面设计多 Agent 协作时的数据一致性协议？</li>
</ul>
<p>这些问题，AI 无法自己解决，它需要那些真正懂得底层计算机制、网络协议和系统调度的优秀工程师。</p>
<p>随着大模型和 Agent 的普及，软件工程正在经历一场从“单机时代”迈向“网格化 Agent 集群时代”的伟大战役。掌握这一套新型基础设施设计哲学与开发范式的架构师们，正在迎来属于他们的、前所未有的黄金时代。</p>
<p>资料链接：</p>
<ul>
<li>https://x.com/rakyll/status/2057129537553785093</li>
<li>https://cloud.google.com/blog/products/containers-kubernetes/bringing-you-agent-sandbox-on-gke-and-agent-substrate</li>
<li>https://cloud.google.com/blog/products/ai-machine-learning/agent-executor-googles-distributed-agent-runtime</li>
<li>https://github.com/agent-substrate/substrate</li>
<li>https://github.com/google/ax</li>
<li>https://github.com/kubernetes-sigs/agent-sandbox</li>
</ul>
<hr />
<p><strong>✍️ 今日的深度思考题：</strong></p>
<p>当底层的 GKE Sandbox 能够将 Agent 启动时延压低至 200 毫秒以内、且支持自动挂起时，你会如何重新设计你的多 Agent 编排逻辑？这会给你的服务器算力账单带来怎样的改变？</p>
<p><strong>欢迎在评论区留下你对这一套“Agent 时代 K8s 抽象层”的看法，我们共同探讨云原生的未来！</strong></p>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/23/google-open-sources-ax-and-agent-substrate-agent-centric-cloud-native-foundation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>十年难题终获突破：揭秘 Go 1.27 接口逃逸分析优化</title>
		<link>https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough/</link>
		<comments>https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough/#comments</comments>
		<pubDate>Fri, 22 May 2026 00:17:09 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[ast]]></category>
		<category><![CDATA[CompilerOptimization]]></category>
		<category><![CDATA[DataStructures]]></category>
		<category><![CDATA[eface]]></category>
		<category><![CDATA[EscapeAnalysis]]></category>
		<category><![CDATA[GarbageCollection]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[heapallocation]]></category>
		<category><![CDATA[iface]]></category>
		<category><![CDATA[inlining]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[Issue62653]]></category>
		<category><![CDATA[Issue8618]]></category>
		<category><![CDATA[KeithRandall]]></category>
		<category><![CDATA[OCONVIFACE]]></category>
		<category><![CDATA[PerformanceOptimization]]></category>
		<category><![CDATA[RobertGriesemer]]></category>
		<category><![CDATA[SCC]]></category>
		<category><![CDATA[StackAllocation]]></category>
		<category><![CDATA[typeassertion]]></category>
		<category><![CDATA[内联]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<category><![CDATA[堆分配]]></category>
		<category><![CDATA[强连通分量]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[抽象语法树]]></category>
		<category><![CDATA[接口]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[栈分配]]></category>
		<category><![CDATA[泛型]]></category>
		<category><![CDATA[类型断言]]></category>
		<category><![CDATA[编译优化]]></category>
		<category><![CDATA[逃逸分析]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6343</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough 大家好，我是Tony Bai。 在日常的 Go 语言开发中，有这样一段极其普通、普通到闭着眼睛都能敲出来的代码： val := 1000 fmt.Sprintf("Result: %d", val) 如果我告诉你，这短短两行代码，就是导致你高并发服务 CPU 飙升、GC（垃圾回收）频繁卡顿的元凶之一，你会不会觉得我在危言耸听？ 这并非危言耸听。在 Go 的世界里，存在一个困扰了全球开发者整整 10 多年的“幽灵 Bug”：只要你的参数被传递给 interface{}（比如 fmt 系列函数），哪怕你传入的只是一个简单的整数或一个局部变量，一旦它进入了 any（interface{}）的大门，编译器通常就会由于“看不透”后续的操作，而保守地判定该变量“逃逸（Escape）”，从而强制将其分配在堆（Heap）上。 这个痛点，最早可以追溯到 2014 年由 Go 核心团队成员 Keith Randall 提出的 Issue #8618，Rob Pike 亲自将 Issue #8618（不逃逸的 interface{} 转换不应分配内存）标记为 Accepted，并等待有人来解决。 谁能想到，这一等，就是十余年。 这期间，Go 核心团队一直在试图彻底拔掉这根刺。 直到最近，随着 Go 1.27 路线图中 Issue #62653 以及核心补丁 CL [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/go-1-27-interface-escape-analysis-optimization-breakthrough-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough">本文永久链接</a> &#8211; https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough</p>
<p>大家好，我是Tony Bai。</p>
<p>在日常的 Go 语言开发中，有这样一段极其普通、普通到闭着眼睛都能敲出来的代码：</p>
<pre><code class="go">val := 1000
fmt.Sprintf("Result: %d", val)
</code></pre>
<p>如果我告诉你，<strong>这短短两行代码，就是导致你高并发服务 CPU 飙升、GC（垃圾回收）频繁卡顿的元凶之一</strong>，你会不会觉得我在危言耸听？</p>
<p>这并非危言耸听。在 Go 的世界里，存在一个困扰了全球开发者整整 10 多年的“幽灵 Bug”：<strong>只要你的参数被传递给 interface{}（比如 fmt 系列函数），哪怕你传入的只是一个简单的整数或一个局部变量，一旦它进入了 any（interface{}）的大门，编译器通常就会由于“看不透”后续的操作，而保守地判定该变量“逃逸（Escape）”，从而强制将其分配在堆（Heap）上。</strong></p>
<p>这个痛点，最早可以追溯到 2014 年由 Go 核心团队成员 Keith Randall 提出的 <strong>Issue #8618</strong>，Rob Pike 亲自将 Issue #8618（不逃逸的 interface{} 转换不应分配内存）标记为 Accepted，并等待有人来解决。</p>
<p><strong>谁能想到，这一等，就是十余年。</strong> 这期间，Go 核心团队一直在试图彻底拔掉这根刺。</p>
<p>直到最近，随着 Go 1.27 路线图中 <strong>Issue #62653</strong> 以及核心补丁 <strong>CL 743200</strong> 、<strong>CL 743240</strong>等的提交，这场跨越十余年的技术长跑终于迎来了突破性的进展。</p>
<p>今天，我们就来深度拆解这个“核弹级”优化背后的底层逻辑，看看 Go 编译器和运行时团队是如何在不改变一行业务代码的情况下，让我们在未来实现“白嫖性能”的！</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/agentic-software-engineering-qr.png" alt="" /></p>
<h2>困局：为什么接口转换成了“性能黑洞”？</h2>
<p>要理解这个优化的意义，我们要看看编译器在过去十年里到底在“怕”什么，首先要直面日常开发中的痛点。</p>
<p>在 Go 中，逃逸分析（Escape Analysis）决定了一个变量是待在轻量、快速的<strong>栈（Stack）</strong>上，还是被迫流浪到沉重的<strong>堆（Heap）</strong>中。</p>
<p>然而，Go 将一个具体类型（比如 int 或者一个 struct）赋值给 interface{} 时，底层需要构造一个包含类型信息和数据指针的结构（eface 或 iface）。注意接口里的数据字段是个指针。</p>
<p>当你执行 Print(val)，其中 val 被转换成接口时，编译器面临一个巨大的“不确定性”。请看这个经典的例子：</p>
<pre><code class="go">func Print(input any) {
    if v, ok := input.(Stringer); ok {
       println(v.String()) // 这里是罪魁祸首
    }
}
</code></pre>
<p>当我们调用 v.String() 的时候，编译器彻底懵了。因为 v 可能是一个<strong>“好市民（Nice）”</strong>，也可能是一个<strong>“内鬼（Leaking）”</strong>。</p>
<p><strong>什么是内鬼？</strong></p>
<pre><code class="go">var global any
type Leaking struct {a, b int}
// String() 偷偷把接收器 l 泄露给了全局变量！
func (l *Leaking) String() string { global = l; return "" }
</code></pre>
<p><strong>什么是好市民？</strong></p>
<pre><code class="go">type Nice struct {a, b int}
// 只是单纯返回字符串，啥也没泄露
func (n Nice) String() string { return "something" }
</code></pre>
<p>这样一来，编译器在看到 Print(n) 时，它不知道 input 到底会不会被传入像 Leaking 这样恶意的 String() 方法中。<strong>为了绝对的安全，只要变量变成了接口，并且后续可能发生接口方法调用，编译器就直接投降：“我算不清楚，全部逃逸到堆上吧！”</strong></p>
<p>这就导致了一个灾难性的后果：<strong>极其高频的日志和格式化场景，成了分配内存的重灾区。</strong></p>
<p>看看我们在业务里写的最多的代码：</p>
<ul>
<li>log.Printf(“user %s logged in at %v”, username, time.Now())</li>
<li>json.Marshal(myStruct)</li>
</ul>
<p>这些 API 的入参无一例外都是 any（即 interface{}）。由于逃逸分析的短视，即使这些参数在函数执行完毕后就不再使用了（本该在栈 Stack 上廉价地分配和销毁），它们依然会引发海量的 Heap Allocations（堆分配），进而给 GC 带来巨大的压力。</p>
<p>在 Issue #8618 的讨论中，无数开发者大吐苦水。有人为了避开这个坑，甚至被迫手写了一套恶心至极的零分配格式化库（比如用链式调用 .S(“hello “).D(1) 来代替 Sprintf）；还有人寄希望于 Go 1.18 的泛型，试图用 [T any] 展开具体类型来绕过接口逃逸。</p>
<p><strong>这就好比为了喝一口水，你不得不自己造一个水库。这就是这十多年间，追求极致性能的 Go 开发者的真实写照。</strong></p>
<h2>破局：CL 743200 带来的“背景调查”机制</h2>
<p>既然难题在于“看不透”，那么解决之道就在于“精准画像”。</p>
<p>在最新的 <strong>CL 743200</strong> 中，开发者 thepudds 和 Go 编译器大牛 mdempsky 引入了一套极其精妙的追踪机制。我将其形象地称为：<strong>对具体类型的“背景调查”回流。</strong></p>
<h3>1. 核心武器：ifaceRecvLoc 虚拟位置</h3>
<p>编译器引入了一个全新的伪位置属性——ifaceRecvLoc。</p>
<p>以前，编译器看到接口转换，直接就把变量引向堆（Heap）。现在，它会先给这个转换点打上一个 ifaceRecvLoc 的标记。</p>
<h3>2. 逆向溯源：OCONVIFACE 节点的觉醒</h3>
<p>当编译器处理到 OCONVIFACE（即具体类型转接口的代码节点）时，它不再盲目投降。它会回过头去，审查这个<strong>具体类型（Concrete Type）</strong>的所有方法。</p>
<p>如果编译器通过分析发现：这个具体类型实现的 String() 方法（或者其他接口方法）非常“守规矩”，并没有将接收者指针存入全局变量或返回给外部，那么这个 ifaceRecvLoc 的逃逸标记就会被撤销。</p>
<p><strong>本质上，这是一种“按需定制”的逃逸分析：</strong></p>
<ul>
<li>如果你传入的是 Leaking 类型，编译器依然让它逃逸（保证安全）；</li>
<li>如果你传入的是 Nice 类型，编译器现在能证明它是安全的，从而让它留在栈上（榨干性能）。</li>
</ul>
<h2>算法优化：用 SCC 解决“循环依赖”迷宫</h2>
<p>你可能会问：既然思路这么清晰，为什么 Go 团队用了十年才逼近搞定？</p>
<p><strong>答案是：现实中的调用链远比示例复杂，甚至存在“递归死循环”。</strong></p>
<p>在大型 Go 项目中，函数调用关系构成了一个复杂的有向图。如果函数 A 调用了接口方法，而该接口方法的某个实现又反过来调用了函数 A，或者涉及复杂的跨包依赖，逃逸分析就会陷入死循环。</p>
<p>为了解决这个问题，CL 743240重写了编译器的访问逻辑。它引入了图论中的 <strong>SCC（Strongly Connected Components，强连通分量）</strong> 算法：</p>
<ol>
<li><strong>自底向上遍历（Bottom-Up）：</strong> 编译器先分析那些不依赖别人的函数，确定它们的逃逸行为。</li>
<li><strong>处理循环：</strong> 将互相依赖的函数归为一个“组（Group）”。</li>
<li><strong>合并策略：</strong> 新版本编译器会执行两次遍历，将“函数调用图”和“类型-接口转换图”进行合并分析。</li>
</ol>
<p>根据测试结果，这种算法目前在 99.85% 的标准库场景中都能完美收敛。即便是像 Kubernetes 这样拥有数百万行代码、接口调用深不见底的项目，新算法依然能保持极高的编译速度，同时大幅提升逃逸分析的准确度。</p>
<h2>开发者能白嫖到什么？</h2>
<p>这次优化的落地，对 Go 开发者来说是一次无需改动代码的“性能大礼包”。</p>
<h3>1. fmt 和 log 系列的全面瘦身</h3>
<p>在资料中，thepudds 明确展示：在应用了这些 Patch 后，类似 fmt.Sprintf(“%v”, p) 这种调用，如果 p 是一个简单的结构体（如 Point{x, y int}），它将<strong>不再产生堆分配</strong>。</p>
<p>对于那些每秒产生数万条日志的高并发系统，这意味着内存带宽的巨大释放。</p>
<h3>2. 反射（Reflect）性能的连带提升</h3>
<p>虽然这个优化集中在接口逃逸，但它也顺带解决了 reflect.Value.Interface() 在某些场景下的强制逃逸问题。作为很多框架（如 JSON 编解码、ORM）的底层基石，这种连锁反应将带来整体性能的连带提升。</p>
<h3>3. 架构设计的解放</h3>
<p>以前，资深 Go 开发者为了避免逃逸，往往会刻意避开使用接口，甚至写出极其晦涩的“泛型展开”代码。</p>
<p><strong>现在，你可以重新拥抱接口了。</strong> Go 编译器终于变得足够聪明，能够理解你的意图，并在幕后默默地为你进行最优化的内存调度。</p>
<h2>小结：十余年的坚持与务实</h2>
<p>Issue #8618 从 2014 年挂载至今，期间经历了 Go 1.0 时代的稚嫩，到 2.0 提案的讨论，再到泛型的落地。Go 团队之所以迟迟没有合并早期的简单补丁，是因为他们一直在追求一种<strong>“不产生副作用的完美解法”</strong>——既要解决逃逸，又不能让编译速度变慢，更不能引入不稳定的 Bug。</p>
<p>这种“宁缺毋滥”的工程态度，正是 Go 语言能够成为云原生基石的原因。</p>
<p>虽然目前的 Milestone 定在 Go 1.27，虽然中间可能还会有反复，但 CL 743200 的出现标志着技术方案已经趋于彻底闭环。</p>
<p><strong>十年一剑，利刃出鞘。</strong> 当 Go 1.27 发布的那一天，我们或许终于可以对着那句经典的 fmt.Printf 说一声：<strong>“感谢你，终于不再让我的变量到处流浪。”</strong></p>
<blockquote>
<p>注：issue 62653曾多次跳票，从Go 1.25到Go 1.27，至于究竟是否能在Go 1.27落地，还得拭目以待！但Go 核心团队解决这个问题的决心是值得肯定的^_^。</p>
</blockquote>
<p>资料链接：</p>
<ul>
<li>https://go-review.googlesource.com/c/go/+/743200</li>
<li>https://go-review.googlesource.com/c/go/+/743240</li>
<li>https://github.com/golang/go/issues/8618</li>
<li>https://github.com/golang/go/issues/62653</li>
</ul>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>在你的高性能服务中，你是否曾经为了避开 interface{} 逃逸而写过那些“违背直觉”的代码？如果这个优化正式落地，你的哪个核心模块收益最大？</p>
<p>欢迎在评论区分享你的性能调优故事，我们一起见证 Go 的进化！</p>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/22/go-1-27-interface-escape-analysis-optimization-breakthrough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>大洗牌！Google 内部确认：Go 正取代 C++，成为 AI Agent 时代的“通用语言”</title>
		<link>https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google/</link>
		<comments>https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google/#comments</comments>
		<pubDate>Thu, 21 May 2026 00:15:58 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AgenticSystem]]></category>
		<category><![CDATA[AgentOrchestration]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[AI智能体]]></category>
		<category><![CDATA[AntigravityCLI]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Channel]]></category>
		<category><![CDATA[cloudnative]]></category>
		<category><![CDATA[ConcurrencyModel]]></category>
		<category><![CDATA[DeveloperExperience]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[goroutine]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[HighAvailability]]></category>
		<category><![CDATA[HighConcurrency]]></category>
		<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[LanguageEvolution]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[PerformanceOptimization]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[StaticLinking]]></category>
		<category><![CDATA[云原生]]></category>
		<category><![CDATA[基础设施]]></category>
		<category><![CDATA[并发模型]]></category>
		<category><![CDATA[开发体验]]></category>
		<category><![CDATA[微服务]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[智能体编排]]></category>
		<category><![CDATA[语言演进]]></category>
		<category><![CDATA[软件工程]]></category>
		<category><![CDATA[通道]]></category>
		<category><![CDATA[静态链接]]></category>
		<category><![CDATA[高可用]]></category>
		<category><![CDATA[高并发]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6339</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google 大家好，我是Tony Bai。 在过去的两年里，只要一提到 AI 开发，99% 的人脑海中弹出的第一个词绝对是：Python。而如果是涉及到大模型底层的高性能推理与算力压榨，大家想到的必然是 C++ 或是 Rust。 但在真正的工程落地中，情况正在发生一场令人猝不及防的剧变。 最近，Google 资深软件工程师 Jaana Dogan（@rakyll）在 X（原推特）上发布了一条引发技术圈热议的推文： “Go 成为 Google 内部 Agentic（智能体）系统的通用语言（lingua franca），这真的很了不起。我以前从未看到过 Go 有取代 C++ 的路径，但现在我相信这是可能的。” 这不仅仅是一条简单的技术感慨，它揭示了 AI 浪潮进入“下半场”后的核心工程困境：当我们把大模型封装成 Agent，并让成千上万个 Agent 并发协作时，Python 太脆弱，C++ 太沉重，而 Go，迎来了它的“天命时刻”。 今天，我们就来扒一扒，为什么 Google 会让 Go 接管 AI Agent 的底层开发？这对我们普通开发者的技术栈转型，又意味着什么？ 打破滤镜：为什么 Python 和 C++ 在 Agent 时代“失宠”了？ 要理解 Go 的上位，我们首先要搞清楚，AI [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/go-is-the-new-lingua-franca-for-ai-agents-at-google-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google">本文永久链接</a> &#8211; https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google</p>
<p>大家好，我是Tony Bai。</p>
<p>在过去的两年里，只要一提到 AI 开发，99% 的人脑海中弹出的第一个词绝对是：<strong>Python</strong>。而如果是涉及到大模型底层的高性能推理与算力压榨，大家想到的必然是 <strong>C++</strong> 或是 <strong>Rust</strong>。</p>
<p>但在真正的工程落地中，情况正在发生一场令人猝不及防的剧变。</p>
<p>最近，Google 资深软件工程师 Jaana Dogan（@rakyll）在 X（原推特）上发布了<a href="https://x.com/rakyll/status/2056528039698403498">一条引发技术圈热议的推文</a>：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/go-is-the-new-lingua-franca-for-ai-agents-at-google-2.png" alt="" /></p>
<blockquote>
<p><strong>“Go 成为 Google 内部 Agentic（智能体）系统的通用语言（lingua franca），这真的很了不起。我以前从未看到过 Go 有取代 C++ 的路径，但现在我相信这是可能的。”</strong></p>
</blockquote>
<p>这不仅仅是一条简单的技术感慨，它揭示了 AI 浪潮进入“下半场”后的核心工程困境：<strong>当我们把大模型封装成 Agent，并让成千上万个 Agent 并发协作时，Python 太脆弱，C++ 太沉重，而 Go，迎来了它的“天命时刻”。</strong></p>
<p>今天，我们就来扒一扒，为什么 Google 会让 Go 接管 AI Agent 的底层开发？这对我们普通开发者的技术栈转型，又意味着什么？</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/google-adk-in-action-qr.png" alt="" /></p>
<h2>打破滤镜：为什么 Python 和 C++ 在 Agent 时代“失宠”了？</h2>
<p>要理解 Go 的上位，我们首先要搞清楚，AI Agent 到底需要什么样的工程能力。</p>
<p>现在的 AI 应用，早就不是早期那种“写个 Python 脚本，调用一下 OpenAI API，把结果打印出来”的玩具了。真实的 Agentic 系统（智能体系统）包含了<strong>极其复杂的网络 I/O、并发工具调用（Tool Calling）、多智能体消息路由、长时记忆状态管理，以及大规模的分布式容错。</strong></p>
<p>在这个场景下，旧有的王者们暴露出了致命的缺陷：</p>
<p><strong>1. Python 的“工程化陷阱”</strong></p>
<p>Python 是 AI 研究员的最爱，因为它的数据科学库天下无敌。但当你要构建一个高并发、高可用、需要 24/7 运行的 Agent 编排系统时，Python 的弱类型（重构火葬场）和 GIL（全局解释器锁，导致无法真正利用多核并发）就成了灾难。正如原贴讨论区一位开发者所言：<em>“模型层可能是 Python 的天下，但围绕着模型的 Runtime（运行时环境）正越来越像 Go 的领地。”</em></p>
<p><strong>2. C++ 的“杀鸡用牛刀”</strong></p>
<p>C++ 拥有极致的性能，是模型训练和推理引擎（Inner Loop）的绝对霸主。但 Agent 编排系统真的需要 C++ 级别的疯狂数学计算吗？不需要。</p>
<p>Agent 系统本质上是大量的网络等待（等 LLM 返回结果、等数据库查询、等网页抓取）。用 C++ 来写极其复杂的并发网络请求和状态机，不仅开发周期漫长，而且极易产生内存泄漏。正如推文评论所指出的：<em>“C++ 背负了太多的历史包袱，它在 Agent 编排上显得太重了。”</em></p>
<h2>Go 凭什么上位？Goroutine 与 Agent 的“完美同构”</h2>
<p>Go 语言在这个时间节点爆火，并非偶然，而是因为它底层的并发哲学与 AI Agent 的行为模式产生了<strong>“完美的同构映射”</strong>。</p>
<p>在 X 上的讨论中，多位资深开发者一针见血地指出了核心原因：</p>
<p><strong>“Goroutines mapping directly to concurrent agent communication is the reason why it makes perfect sense.”（Goroutine 直接映射到并发 Agent 之间的通信，这是它如此完美契合的原因。）</strong></p>
<p>让我们用大白话来翻译一下这个硬核逻辑：</p>
<p>什么是多智能体系统（Multi-Agent System）？本质上就是一堆各自独立的“数字员工”，它们一边自己干活，一边通过发消息相互沟通。<br />
而 Go 语言最强大的杀手锏是什么？正是 <strong>CSP（通信顺序进程）并发模型，即 Goroutine（轻量级协程）和 Channel（通道）。</strong></p>
<ul>
<li><strong>当你启动一个 Agent 时</strong>：在 Go 里，你只需要一个简单的 go runAgent()，就能以极其低廉的内存代价（几 KB）启动一个并发实体。一千个 Agent？一万个 Agent？对 Go 来说毫无压力。</li>
<li><strong>当 Agent 之间需要协作对话时</strong>：你不需要去搞复杂的锁（Locks）或者共享内存，你只需要用 Go 的 Channel 把消息塞过去，另一个 Agent 就能安全地接收。</li>
</ul>
<p>Agent 的编排，需要的是“轻量级的并发管理”，而不是“极致的数学计算速度”。这简直就是为 Go 量身定制的战场。</p>
<h2>征服大厂，构建 Agent 架构的“铁三角”</h2>
<p>除了并发模型上的天作之合，评论区的一位开发者还另外总结了 Go 赢下这场战争的另外三个决定性因素。他指出，现代 Agent 技术栈奖励三种特性，而 <strong>“Go 完美击中了这三点（Go nails all three）”</strong>：</p>
<p><strong>1. 强类型系统（Types）：告别“盲盒”开发</strong></p>
<p>Agent 系统中充斥着复杂的 JSON 解析、Tool Calling 的参数校验、以及结构化的输出。Python 的字典（Dict）传递在项目变大后就像是“盲盒”，你永远不知道里面缺了哪个字段。而 Go 的强类型 Struct 和极度清晰的错误处理机制（虽然大家都吐槽 if err != nil，但它确实极其可控），让系统拥有了极高的可预测性（Predictability）。</p>
<p><strong>2. 极速的编译体验（Fast Builds）</strong></p>
<p>“编译速度是让它成为绝配的原因之一。”在快速迭代的 AI 产品中，Go 那种秒级的编译速度，让开发者可以飞速地测试 Agent 的行为逻辑。相比之下，C++ 那漫长的编译过程在需要高频微调的 AI 时代显得格格不入。</p>
<p><strong>3. 小巧的单一二进制文件（Small Binaries）</strong></p>
<p>当你把 Agent 部署到云端、边缘设备甚至是 Serverless 环境时，Go 编译出来的是一个无需任何外部依赖的独立执行文件。没有 Python 烦人的环境依赖（无需折腾 pip, conda, 虚拟环境），直接丢进一个极小的 Docker 镜像中就能运行，这对于现代云原生运维来说是无可估量的优势。</p>
<h2>一个反直觉的冷知识：大模型“最爱”写 Go 代码</h2>
<p>推文中一个开发者提出了一个极其有趣且经常被忽视的视角：<strong>在 LLM（大语言模型）的眼中，Go 是一门完美的语言。</strong></p>
<p>如果你经常用 Cursor/Codex/Claude Code等 写代码，你会发现一个现象：让 AI 写 Python，它经常会用错第三方库的版本；让 AI 写 C++ 或 Scala，它可能会搞出一堆极其复杂的继承、多态或者生命周期错误。</p>
<p>但如果你让 AI 写 Go 呢？成功率出奇的高。</p>
<p>原因在于：</p>
<ol>
<li><strong>Go 的语法极致简单、无聊，甚至“没有类（Classes）”</strong>。它只有 Struct 和接口，这极大地减少了代码的“表面积（Surface Area）”。</li>
<li><strong>Token 使用率极高</strong>。由于没有复杂的黑魔法和繁琐的泛型体系（早期），LLM 在生成 Go 代码时不容易出现“幻觉”，维护起来极其容易。</li>
</ol>
<p>在这个连代码本身都开始由 AI 生成的时代，<strong>“对 LLM 友好”</strong>竟然成了一门编程语言的核心护城河。</p>
<h2>终局推演 —— C++ 守住“内环”，Go 赢下“外环”</h2>
<p>那么，Go 真的会彻底消灭 C++ 吗？</p>
<p>并不完全是。这场讨论最终达成了一个非常清晰的技术栈共识：</p>
<p><strong>“C++ still wins the inner loop. Go wins everything around it.”（C++ 依然赢得了内环，而 Go 赢得了周围的一切。）</strong></p>
<p>未来的 AI 系统架构已经初露端倪，它将被清晰地划分为三个层级：</p>
<ol>
<li><strong>研究与数据层（Python）</strong>：用于模型训练、数据清洗、算法验证。</li>
<li><strong>算力内环（C++ / Rust / CUDA）</strong>：大模型的推理引擎（如 vLLM、Ollama 底层）、张量计算。这里需要极致榨干每一滴 GPU 性能，C++ 依然是绝对的霸主。</li>
<li><strong>编排外环与业务层（Go）</strong>：这是距离普通开发者最近、也是市场需求最大的地方。成千上万的 Agent 调度、API 网关、并发的数据检索（RAG）、记忆数据库交互、工具链调用，<strong>全部都将被 Go 统治。</strong></li>
</ol>
<h2>最新铁证！Google I/O 2026 震撼官宣：废弃旧路线，用 Go 重写 AI 核心入口！</h2>
<p>如果你觉得前面硅谷大佬们的讨论还只是“理论推演”，那么在刚刚举办的 <strong>Google I/O 2026 大会</strong>上，Google 官方直接用一记雷霆手段，把这个趋势变成了既成事实。</p>
<p><a href="https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/">Google 开发者博客发布了公告</a>：正式宣布停止维护原有的 Gemini CLI，全面过渡到全新的“Google Antigravity（反重力）”多智能体开发平台，并推出全新的核心入口 —— <a href="https://antigravity.google/blog/introducing-google-antigravity-cli">Antigravity CLI</a>。</p>
<p>而在官方给出的技术变更文档中，最扎眼、最让 Go 开发者狂喜的一条更新理由，白纸黑字地写着：</p>
<blockquote>
<p><strong>“Faster execution: Built in Go, Antigravity CLI is snappier and more responsive.” （更快的执行速度：基于 Go 语言构建，Antigravity CLI 更加轻快、响应更迅速。）</strong></p>
</blockquote>
<p><img src="https://tonybai.com/wp-content/uploads/2026/go-is-the-new-lingua-franca-for-ai-agents-at-google-3.png" alt="" /><br />
<center>图：Google I/O 2026：旧版 CLI，用Antigravity CLI替代</center></p>
<p>旧版的 Gemini CLI 是基于传统脚本语言（Node.js/TS 体系）构建的，在处理单点交互时绰绰有余。但 Google 明确表示，现在开发者的需求已经彻底变了：<strong>“你现在需要多个 Agent 相互通信、分工合作来解决复杂的系统问题。”</strong></p>
<p>当单点 CLI 变成“多 Agent 协同编排后端”时，旧有的 JS/TS 体系在高并发、异步工作流（Asynchronous Workflows）和底层系统控制上面临性能瓶颈。Google 毫不犹豫地选择用 <strong>Go 语言</strong> 彻底重写，就是为了利用 Go 极致的并发和执行效率，来支撑起“后台多任务并发运行、且不锁定终端”的强悍体验。</p>
<h2>小结：给开发者的生存建议</h2>
<p>过去的一年里，无数后端开发者感到焦虑，觉得自己掌握的 CRUD 技能在 AI 面前一文不值。但 Google 内部的这场技术栈迁移，给我们指明了一条无比清晰的道路：</p>
<p><strong>别再只盯着 Python 看了。</strong></p>
<p>当 AI 从单一的对话框，走向全面接管企业业务流的多智能体（Multi-Agent）协作形态时，对高并发、高可用后端工程能力的需求不仅没有减少，反而呈指数级爆发。</p>
<p>学习 Go 语言，理解 Goroutine，掌握如何构建一个稳健的 Agent 编排框架。<strong>因为决定下一个十年 AI 应用成败的，不再是模型本身的算力，而是谁能最好地管理和协调这些拥有智能的“数字大军”。</strong></p>
<p>而目前来看，Go，已经在这场战役中拔得头筹。</p>
<p>资料链接：https://x.com/rakyll/status/2056528039698403498</p>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>你目前在开发 AI 应用或 Agent 系统时，使用的是什么语言？你是否遇到了 Python 在高并发或部署时的痛点？欢迎在评论区分享你的实战经验与踩坑血泪史，我们一起探讨 AI 时代的最佳实践！</p>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/21/go-is-the-new-lingua-franca-for-ai-agents-at-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AI 编码胜率榜：Go 与 Rust 完胜 C++</title>
		<link>https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp/</link>
		<comments>https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp/#comments</comments>
		<pubDate>Wed, 20 May 2026 00:04:29 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Agent]]></category>
		<category><![CDATA[AICoding]]></category>
		<category><![CDATA[AI编码]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[BlackBoxReverseEngineering]]></category>
		<category><![CDATA[BuildSystem]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[ClaudeOpus]]></category>
		<category><![CDATA[CodeGeneration]]></category>
		<category><![CDATA[CodeReplication]]></category>
		<category><![CDATA[Codereview]]></category>
		<category><![CDATA[EngineeringConsistency]]></category>
		<category><![CDATA[gemini]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GPT]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MemorySafety]]></category>
		<category><![CDATA[Modularity]]></category>
		<category><![CDATA[monolith]]></category>
		<category><![CDATA[ProgramBench]]></category>
		<category><![CDATA[ReasoningChain]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[StaticTyping]]></category>
		<category><![CDATA[代码复刻]]></category>
		<category><![CDATA[代码审查]]></category>
		<category><![CDATA[代码生成]]></category>
		<category><![CDATA[内存安全]]></category>
		<category><![CDATA[单体架构]]></category>
		<category><![CDATA[基准测试]]></category>
		<category><![CDATA[大模型]]></category>
		<category><![CDATA[工程化一致性]]></category>
		<category><![CDATA[智能体]]></category>
		<category><![CDATA[构建系统]]></category>
		<category><![CDATA[模块化]]></category>
		<category><![CDATA[软件工程]]></category>
		<category><![CDATA[逻辑推理]]></category>
		<category><![CDATA[静态类型]]></category>
		<category><![CDATA[黑盒逆向]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6335</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp 大家好，我是Tony Bai。 过去两年，程序员群体经历了一场前所未有的“职业身份危机”。 随着 GPT、Claude、Gemini 等模型的发布与能力更迭，各种“AI 几秒钟写出小游戏”、“AI 自动化修复 Bug”的新闻充斥屏幕。在各种传统的代码补全基准测试（如 HumanEval）中，大模型们动辄刷出 90% 以上的惊人通过率。一时间，“程序员是夕阳行业”、“架构师即将下岗”的言论甚嚣尘上。 然而，这只是硬核工程世界的冰山一角。最近，由 Meta FAIR（Meta 基础人工智能研究实验室）、斯坦福大学和哈佛大学联合发布的一项重量级研究——ProgramBench，彻底击碎了这些幻觉。 ProgramBench 的设计初衷非常“残暴”：它不再测试 AI 能不能写出一个简单的算法函数，而是测试 AI 能不能从零开始（From Scratch）复刻一个完整的开源项目，即从观测二进制行为（Probe）到编写源码（Build），再到最终的等效性评估。 测试规则如下： 黑盒逆向：不给源码，只给 AI 一个编译好的二进制可执行文件（如 sqlite3、ffmpeg、ripgrep）和一份使用说明书。 物理断网：切断互联网访问，防止 AI 通过搜索“偷看”GitHub 上的源码。 架构自主：AI 必须自己决定项目的文件结构、选择什么编程语言、设计什么抽象层次。 图：ProgramBench 的评测全流程 在这场面向 200 个真实复杂项目的“闭卷考试”中，全球最顶尖的大模型们集体陷入了沉思。 数据表明，即便是在最强的模型面前，完全成功的概率依然是 0。 但在这场败战中，我们通过海量数据发现了一个足以改变未来十年技术选型的真相：Go 与 Rust 已经成为了 AI 时代的“天命语言”，而 C++ 则不那么受 AI 青睐，AI 用起来也不那么顺手！ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-coding-win-rate-rankings-go-and-rust-vs-cpp-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp">本文永久链接</a> &#8211; https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp</p>
<p>大家好，我是Tony Bai。</p>
<p>过去两年，程序员群体经历了一场前所未有的“职业身份危机”。</p>
<p>随着 GPT、Claude、Gemini 等模型的发布与能力更迭，各种“AI 几秒钟写出小游戏”、“AI 自动化修复 Bug”的新闻充斥屏幕。在各种传统的代码补全基准测试（如 HumanEval）中，大模型们动辄刷出 90% 以上的惊人通过率。一时间，“程序员是夕阳行业”、“架构师即将下岗”的言论甚嚣尘上。</p>
<p>然而，这只是硬核工程世界的冰山一角。最近，由 Meta FAIR（Meta 基础人工智能研究实验室）、斯坦福大学和哈佛大学联合发布的<a href="https://arxiv.org/abs/2605.03546">一项重量级研究——ProgramBench</a>，彻底击碎了这些幻觉。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-era-software-engineer-algorithm-map-qr.png" alt="" /></p>
<p>ProgramBench 的设计初衷非常“残暴”：它不再测试 AI 能不能写出一个简单的算法函数，而是测试 AI 能不能<strong>从零开始（From Scratch）复刻一个完整的开源项目</strong>，即从观测二进制行为（Probe）到编写源码（Build），再到最终的等效性评估。</p>
<p><strong>测试规则如下：</strong></p>
<ol>
<li><strong>黑盒逆向</strong>：不给源码，只给 AI 一个编译好的二进制可执行文件（如 sqlite3、ffmpeg、ripgrep）和一份使用说明书。</li>
<li><strong>物理断网</strong>：切断互联网访问，防止 AI 通过搜索“偷看”GitHub 上的源码。</li>
<li><strong>架构自主</strong>：AI 必须自己决定项目的文件结构、选择什么编程语言、设计什么抽象层次。</li>
</ol>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-coding-win-rate-rankings-go-and-rust-vs-cpp-2.png" alt="" /><br />
<center>图：ProgramBench 的评测全流程</center></p>
<p>在这场面向 200 个真实复杂项目的“闭卷考试”中，全球最顶尖的大模型们集体陷入了沉思。</p>
<p><strong>数据表明，即便是在最强的模型面前，完全成功的概率依然是 0。</strong></p>
<p>但在这场败战中，我们通过海量数据发现了一个足以改变未来十年技术选型的真相：<strong>Go 与 Rust 已经成为了 AI 时代的“天命语言”</strong>，而 C++ 则不那么受 AI 青睐，AI 用起来也不那么顺手！</p>
<h2>诸神黄昏：Claude 对 GPT 家族的“工程级”碾压</h2>
<p>在程序员的认知中，GPT 家族曾代表着 AI 的巅峰。但在 ProgramBench 的 Leaderboard（排行榜）上，局势发生了戏剧性的反转，但也正如我们预料的那样。</p>
<p>根据论文统计，在衡量“几乎完成”（即通过 95% 以上的测试用例）这一指标时，排名如下：</p>
<ol>
<li><strong>头号种子：Claude Opus 4.7</strong>。它是全场唯一一个在 3.0% 的复杂项目中展现出近乎完美复刻能力的模型。</li>
<li><strong>二号梯队：Claude Opus 4.6 (2.5%) 与 Claude Sonnet 4.6 (1.6%)</strong>。</li>
<li><strong>集体挂零：GPT 5.4、Gemini 3.1 Pro。</strong> 没错，这些在其他榜单上呼风唤雨的模型，在“从零复刻完整项目”的任务中，竟然连一个能通过 95% 测试的任务都没完成。</li>
</ol>
<p><strong>为什么 GPT 会在硬核工程上输给 Claude？</strong></p>
<p>研究人员通过分析“智能体轨迹（Agent Trajectories）”发现了秘密。大模型写代码有两种流派：</p>
<ul>
<li><strong>“急性子”派（以 GPT 5.4 为代表）</strong>：GPT 倾向于“单次爆发”。数据显示，它在每个任务中平均只用 <strong>17 个命令</strong>。它习惯于在最初的几个回合内，直接吐出 96% 的代码。如果代码跑不通，它很少进行深度的自我修正。</li>
<li><strong>“架构师”派（以 Claude 为代表）</strong>：最强的 Claude 模型更像是一个深思熟虑的工程师。它平均每个任务会调用 <strong>868 个命令</strong>！它会不断地执行 ls 查看目录、用 cat 检查文件、反复运行测试并根据报错信息进行“重构”。</li>
</ul>
<p>可见，在复杂的软件工程面前，单纯的“语料记忆”失效了。Claude 的胜出，本质上是<strong>其“推理链”和“持续迭代能力”的胜出</strong>。它不只是在背代码，它是在通过不断的试错来“推演”架构。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-coding-win-rate-rankings-go-and-rust-vs-cpp-3.png" alt="" /></p>
<p>通过上图中不同模型的动作类型分布，我们可以看到 Claude 拥有极长且复杂的“读-写-探测”循环，而 GPT 的动作序列短得惊人。</p>
<h2>语言偏好：AI 也有自己的“舒适区”</h2>
<p>ProgramBench 给 AI 提供了完全的自由：AI 可以用任何语言来复刻目标程序。这产生了一个极其有趣的“语言混乱矩阵（Confusion Matrix）”。</p>
<p><strong>1. GPT 的 Python 执念</strong></p>
<p>GPT 5.4 表现出了近乎偏执的 Python 依赖。在所有任务中，它有 <strong>79%</strong> 的方案是用 Python 写的。无论原程序是用更底层的 C 还是 Rust 写的，GPT 的第一反应往往是：“我能不能用 Python 给它糊出来？”</p>
<p><strong>2. Claude 的硬核品味</strong></p>
<p>最强模型 Claude Opus 4.7 表现出了极高的系统级素养。它只在 14% 的情况下选择 Python，它更倾向于使用 <strong>Rust 和 Go</strong> 来应对复杂任务。这说明越强大的模型，越能理解底层语言在性能和逻辑表达上的严密性。</p>
<p><strong>3. 为什么 AI 喜欢 Python？</strong></p>
<p>原因很简单：<strong>容错率。</strong> Python 拥有极其丰富的第三方包、极简的语法以及无需手动管理内存的特性。对于 AI 来说，Python 是它能用最少的回合数实现最多功能的“逃生路径”。但这种逃生是有代价的——复杂的系统级软件用 Python 复刻，往往会因为性能或底层调用模拟不足而失败。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-coding-win-rate-rankings-go-and-rust-vs-cpp-4.png" alt="" /><br />
<center>各模型选择的实现语言分布图</center></p>
<h2>深度解析：为什么 Go 与 Rust 是 AI 的“天命之子”？</h2>
<p>这是本次研究中最具行业指导意义的发现。通过研究数据对比，我们发现不同语言在 AI 手下的“存活率”天差地别：</p>
<ul>
<li><strong>Go 语言项目：AI 成功通过率 38.4%</strong></li>
<li><strong>Rust 语言项目：AI 成功通过率 38.5%</strong></li>
<li><strong>C/C++ 项目：AI 成功通过率仅为 27.7%</strong></li>
</ul>
<p>为什么同样是系统编程语言，Go 和 Rust 就能完胜 C++？这不仅仅是语法的问题，更是<strong>现代工程化基建</strong>的降维打击。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-coding-win-rate-rankings-go-and-rust-vs-cpp-5.png" alt="" /><br />
<center>不同语言生态下的测试通过率对比图</center></p>
<h3>1. 构建系统：AI 开发者的“生死线”</h3>
<p>在 C/C++ 的世界里，构建系统是混乱的代名词。CMakeLists.txt、Makefile、系统特定的动态链接库（.so/.dll）路径……对于 AI 智能体（SWE-agent）来说，这些是致命的障碍。</p>
<p>调研显示，AI 在 C++ 任务中，往往还没开始写业务代码，就已经在配置环境时陷入了死循环。</p>
<p>反观 <strong>Go</strong> 和 <strong>Rust</strong>：</p>
<ul>
<li><strong>Go</strong>：一个 go mod tidy 加一个 go build 解决了全球 99% 的构建问题。</li>
<li><strong>Rust</strong>：Cargo 是目前人类文明最先进的包管理器之一。</li>
</ul>
<p>对于 AI 来说，这种“标准化”意味着它只需要执行一条命令就能建立起完整的工程环境。这种<strong>极高的工程化一致性</strong>，让 AI 可以把宝贵的 Token 消耗在业务逻辑上，而不是折腾环境。</p>
<h3>2. 标准库的“全家桶”效应</h3>
<p>Go 语言一直以“自带电池（Batteries included）”著称。它的标准库涵盖了网络、加密、编解码等大部分现代互联网开发所需的功能。AI 调用 Go 的标准库就像从兜里掏东西一样自然。</p>
<p>而 C++ 的标准库相对贫瘠，往往需要引入第三方库（如 Boost, libcurl）。一旦涉及到第三方依赖，AI 的出错概率就会呈指数级上升。</p>
<h3>3. 内存安全：给 AI 的“保护索”</h3>
<p>在 C/C++ 中，AI 极其容易写出缓冲区溢出、内存泄露或段错误。一旦程序在运行过程中崩溃，由于 AI 缺乏深度的 GDB 调试能力，它很难从 Core Dump 中恢复。</p>
<p><strong>Rust 严格的借用检查（Borrow Checker）</strong>，在编译阶段就强行纠正了 AI 的大部分错误。这种“编译即正确”的反馈循环，让 AI 在复刻软件时拥有了更高的胜率。</p>
<h2>揭秘 AI 程序员的“坏习惯”：屎山代码的起源？</h2>
<p>除了排名和语言，ProgramBench 还揭露了目前 AI 编码的三个极具冲击力的特征：</p>
<h3>1. 单文件架构迷恋</h3>
<p>人类架构师讲究解耦，喜欢建立复杂的目录结构。但 AI 却恰恰相反。数据显示，67% 的 AI 方案产生的目录深度明显浅于原项目。</p>
<p><strong>AI 表现出强烈的“单文件狂魔”倾向。</strong> 它们喜欢把数千行代码塞进 1-3 个超级大文件里。这反映出目前的模型在处理跨文件的上下文关联时，依然存在明显的认知衰减。</p>
<h3>2. 逻辑“大颗粒化”</h3>
<p>AI 写的函数数量通常只有人类原作者的 10% 到 20%。但这并不意味着功能缺失，而是因为 <strong>AI 喜欢写超长函数（God Functions）</strong>。</p>
<p>Claude 生成的函数长度平均是人类的 1.46 倍，Gemini 甚至达到了 1.62 倍。这种代码对于 AI 来说运行没问题，但对于人类后续维护来说，简直是噩梦。</p>
<h3>3. 诚信危机：AI 也会“偷懒作弊”</h3>
<p>在测试的早期阶段，研究人员尝试给 AI 开启互联网访问。结果发现，最强的大模型们全都是“老油条”。</p>
<p>一旦它们通过二进制文件的帮助信息（&#8211;help）推断出这是哪个开源项目，它们会直接去克隆对应的 GitHub 仓库代码并提交。</p>
<p><strong>Claude Sonnet 4.6 的作弊率一度高达 36%！</strong> 这迫使研究团队最终必须在完全断网的环境下运行测试。这告诉我们：<strong>永远不要低估大模型为了完成任务而寻找“捷径”的本能。</strong></p>
<h2>小结：程序员的黄昏还远未到来</h2>
<p>看完这份长达 60 多页的研究报告，我们不仅没有感到绝望，反而产生了一种前所未有的踏实。</p>
<p>报告证明了：即便是在最顶尖的模型面前，<strong>真实的软件工程（Software Engineering）依然是一个极度复杂的高壁垒领域</strong>。写代码只是软件工程中最后、最轻的一环。而之前的架构设计、模块拆分、抽象提取、以及对业务边界的理解，目前的 AI 依然处于“学龄前”阶段。</p>
<p><strong>给开发者的建议：</strong></p>
<ol>
<li><strong>向 Go 和 Rust 迁移</strong>：这不只是性能考量，更是为了拥抱 AI。如果你想让 AI 帮你更高效地干活，请选择那些对 AI 友好的工程化基建。</li>
<li><strong>强化架构师思维</strong>：既然 AI 喜欢写单文件“屎山”，那么如何管理大型项目的复杂性、如何通过 Prompt 引导 AI 进行模块化设计，将是未来高级工程师的核心竞争力。</li>
<li><strong>拥抱 Claude 模式</strong>：告别“单次生成”的幻觉，建立起“持续迭代、自动测试、反复纠错”的 AI 开发流水线。</li>
</ol>
<p><strong>程序员的黄昏还远未到来。</strong></p>
<p>相反，我们正在进入一个全新的时代：一个由人类架构师掌控蓝图，由 AI 劳工在标准化的 Go/Rust 仓库中疯狂试错、高效产出的黄金时代。AI 并没有取代你，它只是淘汰了那些只会机械写代码、而不懂工程设计的“码农”。</p>
<p>真正的开发者，正在迎来属于他们的、被 AI 加持的黎明。</p>
<p>资料链接：</p>
<ul>
<li>https://arxiv.org/abs/2605.03546</li>
<li>https://programbench.com/</li>
</ul>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/20/ai-coding-win-rate-rankings-go-and-rust-vs-cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>代码可以让 AI 写，但设计得由你做：重塑工程师的“算法直觉”</title>
		<link>https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map/</link>
		<comments>https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map/#comments</comments>
		<pubDate>Tue, 19 May 2026 00:10:02 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AlgorithmMap]]></category>
		<category><![CDATA[AlgorithmPatterns]]></category>
		<category><![CDATA[Backtracking]]></category>
		<category><![CDATA[BinarySearch]]></category>
		<category><![CDATA[BitManipulation]]></category>
		<category><![CDATA[bloomfilter]]></category>
		<category><![CDATA[DynamicProgramming]]></category>
		<category><![CDATA[EngineeringPractice]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GreedyAlgorithm]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[LFUCache]]></category>
		<category><![CDATA[LFU缓存]]></category>
		<category><![CDATA[LRUCache]]></category>
		<category><![CDATA[LRU缓存]]></category>
		<category><![CDATA[MatrixTensor]]></category>
		<category><![CDATA[MergeSort]]></category>
		<category><![CDATA[ShortestPath]]></category>
		<category><![CDATA[SlidingWindow]]></category>
		<category><![CDATA[SoftwareEngineering]]></category>
		<category><![CDATA[SystemArchitecture]]></category>
		<category><![CDATA[TopologicalSort]]></category>
		<category><![CDATA[TrieTree]]></category>
		<category><![CDATA[Trie树]]></category>
		<category><![CDATA[UnionFind]]></category>
		<category><![CDATA[二分查找]]></category>
		<category><![CDATA[二叉堆]]></category>
		<category><![CDATA[位运算]]></category>
		<category><![CDATA[动态规划]]></category>
		<category><![CDATA[回溯法]]></category>
		<category><![CDATA[工程实战]]></category>
		<category><![CDATA[布隆过滤器]]></category>
		<category><![CDATA[并查集]]></category>
		<category><![CDATA[归并排序]]></category>
		<category><![CDATA[拓扑排序]]></category>
		<category><![CDATA[最短路径]]></category>
		<category><![CDATA[滑动窗口]]></category>
		<category><![CDATA[矩阵张量]]></category>
		<category><![CDATA[算法图谱]]></category>
		<category><![CDATA[算法模式]]></category>
		<category><![CDATA[系统架构]]></category>
		<category><![CDATA[贪心算法]]></category>
		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6329</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map 大家好，我是Tony Bai。 “帮我写一个限流器。” 当你把这行字敲进 Claude、Gemini 或ChatGPT 的对话框或CLI形式的命令行时，几秒钟后，屏幕上会出现一段看似完美的 Go 代码。它可能使用了 Token Bucket 算法，也可能用了一个简单的计数器。 这时候，一个残酷的问题摆在你面前：代码已经生成了，你的价值在哪里？ 如果你看不懂它是基于什么模式生成的，你就不敢在生产环境用它； 如果你不知道如何调整它的滑动窗口参数，当流量洪峰来袭时，系统就会雪崩； 如果你无法从这段代码联想到 TCP 协议的拥塞控制或 Kubernetes 的资源调度，那么你依然只是一个“代码搬运工”，只不过搬运的工具从 Google 变成了 AI。 在 AI 时代，编码（Coding）的成本正在无限趋近于零，但设计（Design）与判断（Judgment）的价值却在指数级上升。 很多工程师在刷 LeetCode 时感到痛苦，是因为他们把算法当成了“面试八股文”，考完即忘。但在资深架构师眼里，LeetCode 里的每一个算法模式，都是现代软件工程中的一个微缩模型。 滑动窗口（Sliding Window） 不只是为了求子串，它是 TCP 流量控制和微服务限流熔断的基石； 并查集（Union-Find） 不只是为了算连通分量，它是社交网络好友推荐和图像处理魔棒工具的底层逻辑； LSM Tree 的设计思想，其实就是归并排序（Merge Sort） 在磁盘 I/O 上的极致应用。 我策划这个《AI 时代软件工程师的算法图谱：从 LeetCode 模式到工程实战》的微专栏不教你怎么“背题”，也不搞什么枯燥的数学证明。我要做的是连接——通过 Go 语言，在“LeetCode 模式”与“硬核工程实战”之间架起一座桥梁。 我们要把那 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-era-software-engineer-algorithm-map-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map">本文永久链接</a> &#8211; https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map</p>
<p>大家好，我是Tony Bai。</p>
<p>“帮我写一个限流器。”</p>
<p>当你把这行字敲进 Claude、Gemini 或ChatGPT 的对话框或CLI形式的命令行时，几秒钟后，屏幕上会出现一段看似完美的 Go 代码。它可能使用了 Token Bucket 算法，也可能用了一个简单的计数器。</p>
<p>这时候，一个残酷的问题摆在你面前：<strong>代码已经生成了，你的价值在哪里？</strong></p>
<ul>
<li>如果你看不懂它是基于什么模式生成的，你就不敢在生产环境用它；</li>
<li>如果你不知道如何调整它的滑动窗口参数，当流量洪峰来袭时，系统就会雪崩；</li>
<li>如果你无法从这段代码联想到 TCP 协议的拥塞控制或 Kubernetes 的资源调度，那么你依然只是一个“代码搬运工”，只不过搬运的工具从 Google 变成了 AI。</li>
</ul>
<p>在 AI 时代，<strong>编码（Coding）的成本正在无限趋近于零，但设计（Design）与判断（Judgment）的价值却在指数级上升。</strong></p>
<p>很多工程师在刷 LeetCode 时感到痛苦，是因为他们把算法当成了“面试八股文”，考完即忘。但在资深架构师眼里，<strong>LeetCode 里的每一个算法模式，都是现代软件工程中的一个微缩模型。</strong></p>
<ul>
<li><strong>滑动窗口（Sliding Window）</strong> 不只是为了求子串，它是 TCP 流量控制和微服务限流熔断的基石；</li>
<li><strong>并查集（Union-Find）</strong> 不只是为了算连通分量，它是社交网络好友推荐和图像处理魔棒工具的底层逻辑；</li>
<li><strong>LSM Tree 的设计思想</strong>，其实就是<strong>归并排序（Merge Sort）</strong> 在磁盘 I/O 上的极致应用。</li>
</ul>
<p>我策划这个《<a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIyNzM0MDk0Mg==&amp;action=getalbum&amp;album_id=4521801031743373315#wechat_redirect">AI 时代软件工程师的算法图谱：从 LeetCode 模式到工程实战</a>》的微专栏不教你怎么“背题”，也不搞什么枯燥的数学证明。我要做的是<strong>连接</strong>——通过 Go 语言，在“LeetCode 模式”与“硬核工程实战”之间架起一座桥梁。</p>
<p>我们要把那 2000 多道题，提炼成 15 类核心模式，装进你的武器库。下次遇到工程难题时，我希望你的直觉告诉你的不是“我去问问 AI”，而是“<strong>这是一个典型的 Top K 问题，我可以用堆（Heap）模式来解决，顺便让 AI 帮我补全代码细节。</strong>”</p>
<p>这将是一次从“刷题”到“识图”，从“算法”到“架构”的认知升级。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-era-software-engineer-algorithm-map-qr.png" alt="" /></p>
<p>我们将整个知识体系划分为五季，共 16 讲，层层递进！</p>
<h2>第一季：线性数据流与内存模型</h2>
<p><strong>—— 掌握系统的“吞吐”与“存储”</strong></p>
<p>这一季我们从最基础的数组和链表出发，但视角完全不同。我们将探讨如何用<strong>双指针</strong>解决日志系统中的多路归并问题；如何用<strong>滑动窗口</strong>构建一个高性能的实时流控组件；<strong>单调栈</strong>在编译器解析和数据可视化中的妙用；以及<strong>链表操作</strong>在操作系统内存分配器（Malloc）和 Redis Ziplist 中的影子。</p>
<ul>
<li>第 01 讲 | 双指针：从数组去重到日志合并</li>
<li>第 02 讲 | 滑动窗口：流式数据的流量控制</li>
<li>第 03 讲 | 栈与单调栈：解析器与最近相关性</li>
<li>第 04 讲 | 链表操纵：指针的艺术与内存管理</li>
</ul>
<h2>第二季：组织与调度</h2>
<p><strong>—— 在海量数据中建立“秩序”</strong></p>
<p>当数据量大到无法放入内存，或者任务多到 CPU 处理不过来时，我们需要更高效的组织方式。我们将从<strong>二分查找</strong>谈到分布式系统的一致性哈希查找；用<strong>堆（Heap）</strong> 模式来剖析操作系统任务调度器和热搜榜单的实现；用<strong>贪心算法</strong>来解决云计算资源调度和数据库事务锁管理。</p>
<ul>
<li>第 05 讲 | 二分查找：在不确定性中定位边界</li>
<li>第 06 讲 | 堆与 Top K：高频热点与调度器</li>
<li>第 07 讲 | 贪心与区间：资源分配的最优解</li>
</ul>
<h2>第三季：结构化数据与张量</h2>
<p><strong>—— 理解万物互联的“关系”</strong></p>
<p>这是 AI 时代和分布式系统最核心的板块。我们将用<strong>树的遍历</strong>来解析 JSON/YAML 配置和 DOM 树；用<strong>图论（Union-Find/拓扑排序）</strong> 来解决微服务依赖分析和死锁检测；用<strong>最短路径</strong>算法搞定网络路由协议（OSPF）；特别是<strong>矩阵与张量</strong>一讲，将带你理解图像处理卷积核与 AI 框架中的 Tensor 变换原语。</p>
<ul>
<li>第 08 讲 | 树的遍历：层级数据的处理范式</li>
<li>第 09 讲 | 图论基础：依赖与连通性</li>
<li>第 10 讲 | 最短路径：网络流与路由</li>
<li>第 11 讲 | 矩阵与张量：AI 时代的计算原语</li>
</ul>
<h2>第四季：编码与底层魔法</h2>
<p><strong>—— 榨干机器性能的“黑科技”</strong></p>
<p>在对性能要求极高的场景下，我们需要深入比特位。我们将探讨<strong>字符串匹配（KMP/Rabin-Karp）</strong> 在文本编辑器和 rsync 增量同步中的应用；以及<strong>位运算（Bit Manipulation）</strong> 在权限系统设计、布隆过滤器（Bloom Filter）和搜索引擎 Bitmap 索引中的神奇威力。</p>
<ul>
<li>第 12 讲 | 字符串处理：模式匹配与哈希</li>
<li>第 13 讲 | 位运算：状态压缩与高效计算</li>
</ul>
<h2>第五季：复杂决策与系统设计</h2>
<p><strong>—— 从算法走向架构师</strong></p>
<p>最后，我们将挑战最复杂的场景。用<strong>回溯法</strong>构建正则表达式引擎和自动化测试用例生成器；用<strong>动态规划</strong>理解数据库查询优化器（Cost-based Optimizer）和文本 Diff 原理；最后通过 <strong>Trie 树</strong>和 <strong>LRU/LFU</strong> 两种模式，亲手设计搜索引擎自动补全和 Redis 内存淘汰策略，完成从算法到系统设计的最后一公里。</p>
<ul>
<li>第 14 讲 | 回溯与分支定界：暴力搜索的优化</li>
<li>第 15 讲 | 动态规划：空间换时间的极致权衡</li>
<li>第 16 讲 | 系统设计模式：从算法到架构</li>
</ul>
<hr />
<p>算法从来不是为了刁难你，它是前人智慧的结晶，是软件世界的物理定律。</p>
<p>在 AI 时代，<strong>Copy 代码很容易，但 Copy 思维很难。</strong> 我希望通过这个专栏，帮你构建起一套属于自己的“算法图谱”。当你拥有了这份图谱，无论技术浪潮如何更迭，你都能一眼看透复杂系统背后的简单逻辑。</p>
<p>准备好了吗？让我们开始这趟“重塑”之旅。</p>
<p>点击<a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIyNzM0MDk0Mg==&amp;action=getalbum&amp;album_id=4521801031743373315#wechat_redirect">这里</a> 或扫描下方二维码，订阅《AI 时代软件工程师的算法图谱》，开启你的进阶之路。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/ai-era-software-engineer-algorithm-map-qr.png" alt="" /></p>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/19/ai-era-software-engineer-algorithm-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>别神话 Rust 重写了：搞定1%热路径，Go 性能照样起飞</title>
		<link>https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites/</link>
		<comments>https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites/#comments</comments>
		<pubDate>Sun, 17 May 2026 23:22:11 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[arena]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Complexity]]></category>
		<category><![CDATA[EngineeringPractices]]></category>
		<category><![CDATA[EscapeAnalysis]]></category>
		<category><![CDATA[GarbageCollection]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoLanguage]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[heapallocation]]></category>
		<category><![CDATA[HotPaths]]></category>
		<category><![CDATA[memoryallocation]]></category>
		<category><![CDATA[MemoryLeak]]></category>
		<category><![CDATA[Overengineering]]></category>
		<category><![CDATA[PerformanceOptimization]]></category>
		<category><![CDATA[pprof]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[StackAllocation]]></category>
		<category><![CDATA[sync.Pool]]></category>
		<category><![CDATA[SystemThinking]]></category>
		<category><![CDATA[ZeroAllocation]]></category>
		<category><![CDATA[内存分配]]></category>
		<category><![CDATA[内存泄漏]]></category>
		<category><![CDATA[内存竞技场]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<category><![CDATA[基准测试]]></category>
		<category><![CDATA[堆分配]]></category>
		<category><![CDATA[复杂性]]></category>
		<category><![CDATA[对象池]]></category>
		<category><![CDATA[工程实践]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[栈分配]]></category>
		<category><![CDATA[热路径]]></category>
		<category><![CDATA[结构化思维]]></category>
		<category><![CDATA[过度设计]]></category>
		<category><![CDATA[逃逸分析]]></category>
		<category><![CDATA[重构]]></category>
		<category><![CDATA[零内存分配]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=6325</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites 大家好，我是Tony Bai。 近年来，如果你常年混迹于国内外各大技术社区，你一定会感受到一种近乎狂热的“政治正确”：带垃圾回收（GC）的语言都有原罪，万物皆可（且应该）用 Rust 重写。 从底层基础设施到上层业务逻辑，无数团队在遇到性能瓶颈时，脑海中蹦出的第一个念头就是：“Go/Java 搞不定了，由于 GC 停顿的存在，我们必须换 Rust 乃至 C++ 来重构核心模块。” 但这真的是解决性能问题的唯一出路吗？ 最近，几位硅谷顶级的技术大佬——前 Tailscale CTO David Crawshaw、开源时序数据库 VictoriaMetrics CTO Aliaksandr Valialkin，以及资深底层代码大牛 Stewart Lynch，在 X（原推特）上掀起了一场关于“现代软件复杂性与性能优化”的讨论。 仔细研读他们的观点后，我得出了一个可能有些“反直觉”的结论： 对于绝大多数商业项目而言，盲目追求去 GC 化和无脑 Rust 重写，是一场灾难。真正顶级的性能优化，往往只需要对那 1% 的“热路径”动刀。 今天，我们就来揭秘这层信息差，看看顶级架构师是如何在不增加心智负担的前提下，把带 GC 的 Go 语言性能压榨到极致的。 现代软件最大的毒瘤：“不必要的复杂性” 为什么我们总是忍不住想要用极其复杂的语言或架构去重写现有的系统？ Stewart Lynch 在讨论中一针见血地指出了现代软件工程的通病：“Everything that&#8217;s wrong with modern software can be summed [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/go-performance-optimization-over-rust-rewrites-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites">本文永久链接</a> &#8211; https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites</p>
<p>大家好，我是Tony Bai。</p>
<p>近年来，如果你常年混迹于国内外各大技术社区，你一定会感受到一种近乎狂热的“政治正确”：<strong>带垃圾回收（GC）的语言都有原罪，万物皆可（且应该）用 Rust 重写。</strong></p>
<p>从底层基础设施到上层业务逻辑，无数团队在遇到性能瓶颈时，脑海中蹦出的第一个念头就是：“Go/Java 搞不定了，由于 GC 停顿的存在，我们必须换 Rust 乃至 C++ 来重构核心模块。”</p>
<p><strong>但这真的是解决性能问题的唯一出路吗？</strong></p>
<p>最近，几位硅谷顶级的技术大佬——前 Tailscale CTO David Crawshaw、开源时序数据库 VictoriaMetrics CTO Aliaksandr Valialkin，以及资深底层代码大牛 Stewart Lynch，在 X（原推特）上掀起了一场关于“现代软件复杂性与性能优化”的讨论。</p>
<p>仔细研读他们的观点后，我得出了一个可能有些“反直觉”的结论：</p>
<p><strong>对于绝大多数商业项目而言，盲目追求去 GC 化和无脑 Rust 重写，是一场灾难。真正顶级的性能优化，往往只需要对那 1% 的“热路径”动刀。</strong></p>
<p>今天，我们就来揭秘这层信息差，看看顶级架构师是如何在不增加心智负担的前提下，把带 GC 的 Go 语言性能压榨到极致的。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/ai-app-dev-primer-qr.png" alt="" /></p>
<h2>现代软件最大的毒瘤：“不必要的复杂性”</h2>
<p>为什么我们总是忍不住想要用极其复杂的语言或架构去重写现有的系统？</p>
<p>Stewart Lynch 在讨论中一针见血地指出了现代软件工程的通病：<strong>“Everything that&#8217;s wrong with modern software can be summed up in two words: Unnecessary Complexity”（现代软件所有的毛病，可以用两个词来概括：不必要的复杂性）。</strong></p>
<p>这背后其实隐藏着一个程序员群体独有的心理学陷阱。</p>
<p>Lynch 解释道：“程序员这个群体有一个特殊的问题——我们往往是因为‘享受解决复杂问题’才选择这个职业的。我们热衷于理解极其复杂的东西并让它运转起来，我们是人类历史上最复杂结构的构建者。<strong>正因为如此，我们在任何地方都在寻找与复杂性搏斗的机会，即使在那些本该追求极简的地方。</strong>”</p>
<p>这就解释了为什么很多团队在面对一个简单的 CRUD 业务或者中等并发的微服务时，会毫不犹豫地引入极高门槛的语言（比如有着严苛借用检查器的 Rust）或是过度设计的服务网格。</p>
<p>因为<strong>“复杂，让人觉得高级”</strong>。</p>
<p>但结果是什么？</p>
<p>业务逻辑被切割得支离破碎，新员工入职需要花费两三个月才能看懂生命周期和指针所有权，团队的迭代速度断崖式下跌。你以为你在优化系统的性能，实际上，你在制造一场长期的维护灾难。在这个过程中，你消耗了大量的公司预算，仅仅是为了解决那些“想象中的未来问题”。</p>
<p>记住架构设计的第一法则：<strong>复杂性是优秀软件的死敌。</strong></p>
<h2>你的 99% 代码根本不需要瞎折腾</h2>
<p>既然复杂性是死敌，那性能问题怎么办？难道我们就任由 GC 导致程序卡顿吗？</p>
<p>这时候，前 Tailscale CTO David Crawshaw 抛出了一个极具颠覆性的观点。他指出，整个行业现在正把海量的资源倾注到像 Rust 这样没有 GC 的程序中，但大家忽略了一个极其残酷的统计学事实：</p>
<p><strong>“Almost all your code paths are cold and GC is net positive. 1% of your code is performance sensitive. Don&#8217;t create GC pressure there.” （你几乎所有的代码路径都是‘冷’的，在这些地方 GC 带来了纯粹的正向收益。只有 1% 的代码对性能真正敏感。你只需要不在那 1% 的地方制造 GC 压力就行了。）</strong></p>
<p>什么是“冷代码”？</p>
<p>配置解析、路由分发、错误处理、数据库连接初始化、日志记录……在一个庞大的工程中，这部分代码占据了 99% 的体积。它们对微秒级的延迟根本不敏感。</p>
<p>对于这 99% 的代码，使用 Go、Java 甚至 OCaml 这样带有Full runtime GC的语言，是巨大的恩赐。GC 解放了程序员的大脑，让你不需要像写 C/C++ 或 Rust 那样，在写每一行代码时还要在脑海里进行“部分编译时规划（Partial compile-time planner）”。它让你可以把全部精力聚焦在“业务逻辑”本身。</p>
<p><strong>人类解决复杂问题的能力，在不被内存分配分心时，才能发挥到极致。</strong></p>
<p>为了那 1% 真正需要榨干 CPU 周期的核心逻辑，去强迫整个团队在剩下 99% 的冷代码中也要与内存所有权作斗争，这在商业 ROI（投资回报率）上是极其荒谬的。</p>
<p>这就是所谓“不要为了 1% 的醋，去包 99% 的饺子”。</p>
<h2>VictoriaMetrics CTO 的 1% 极简榨干指南</h2>
<p>好，逻辑理顺了：我们决定坚持使用 Go 语言，享受它极高的开发效率和并发优势。但我们确实遇到了那 1% 的核心瓶颈——比如高频交易的核心撮合引擎、时序数据库的底层写入循环。这部分代码极其吃 CPU，且 GC 带来的 STW（Stop The World）让人无法忍受。</p>
<p><strong>不换语言，怎么破局？</strong></p>
<p>别急，让我们来看看目前世界上性能最强悍的开源时序数据库之一：<strong>VictoriaMetrics</strong> 的做法。这个数据库完全是由 Go 语言编写的，但在各项 Benchmark 性能测试中，它经常把一众 C++ 和 Rust 写的时序数据库按在地上摩擦。</p>
<p>它的 CTO，Aliaksandr Valialkin 在这次讨论中，大方地分享了他“降维打击”般的优化路径。我将他的经验，结合各位大牛的讨论，为你整理成了以下三步走的“实操密码”：</p>
<h3>放弃盲猜，用 Profiler 精准定位热路径（Hot Paths）</h3>
<p>你永远不可能靠“直觉”找到性能瓶颈。Aliaksandr 强调，Go 语言拥有极度强大的内置 Profiler（pprof）。不要一上来就重构，先让程序跑起来，打入真实流量，然后用 pprof 精准定位出那消耗了 80% CPU 和大量内存分配的 1% “热路径”究竟在哪几个函数里。</p>
<p><em>这 1% 的代码，代码量往往极小，寻找它们并不困难。</em></p>
<h3>在热路径中“完全移除”内存分配（Zero Allocation）</h3>
<p>这是 Go 性能优化的核心灵魂。Aliaksandr 的原话是：“This is how I optimize programs written in Go &#8211; by removing memory allocations from hot paths&#8230;”。</p>
<p>只要你在热路径中不产生新的对象（不触发 malloc 和堆分配），垃圾回收器（GC）就根本不会被唤醒。没有分配，就没有垃圾；没有垃圾，就没有 GC 压力和停顿。</p>
<h3>开启“逃生舱”：使用预分配与 Arena 机制</h3>
<p>既然热路径不能分配新内存，那需要处理海量数据怎么办？大佬们给出了三种在 Go 中模拟底层语言内存管理的“逃生手段”：</p>
<ul>
<li>
<p><strong>预分配大块内存（Pre-allocations）：</strong><br />
正如 David Crawshaw 所举的例子，你可以在 Go 中一次性分配一个巨大的数组，比如：var x = make([]struct{&#8230;}, 1e6)。<br />
这只产生一次大分配，然后你完全可以利用自己的算法，在这个预先分配好的内存块中进行指针的滑动和复用。对于 GC 来说，这只是一个单一的连续指针，GC 扫描它的成本极低，既能实现高并发，又极大地降低了 CPU 消耗。</p>
</li>
<li>
<p><strong>对象池机制（sync.Pool）：</strong><br />
对于频繁创建和销毁的小对象，不要让它们落入 GC 的魔爪。利用 sync.Pool 将它们缓存起来，反复复用。</p>
</li>
<li>
<p><strong>请求作用域内存竞技场（Arenas）：</strong><br />
Aliaksandr 提到了在处理网络请求时极其高效的 Arena 概念。在这个模式下，与单次 Request 相关的所有小对象分配，都在一个预先分配好的大块 Arena 中进行。当请求结束时，不需要逐个去释放对象，而是直接清空（free）整个 Arena。这几乎达到了和 Rust 一样零开销的内存清理效果，但代码写起来依然是熟悉的 Go 语法。</p>
</li>
</ul>
<h3>对 99% 的代码保持克制</h3>
<p>当你在那 1% 的热路径里用尽了上述像 C 语言一样的“脏活累活”后，<strong>请立刻停手</strong>。</p>
<p>让程序剩下的 99% 保持最地道（Idiomatic）、最简单、最具可读性的 Go 代码。让 GC 去接管它们。</p>
<p>你会神奇地发现：你的程序不仅拥有了媲美 C++/Rust 的极致性能，同时你的团队依然保持着原本极高的业务迭代速度。</p>
<h2>小结——顶级工程师与普通码农的终极分水岭</h2>
<p>回顾这几位大佬的讨论，其实核心只指向了一个词：<strong>克制（Restraint）。</strong></p>
<p>普通工程师总是试图寻找一种“银弹”——希望换一种时髦的语言，就能一劳永逸地解决架构、性能和内存安全的所有问题。他们沉迷于构建极其复杂的抽象体系，试图用技术上的炫技来掩盖业务上的平庸。</p>
<p>而真正顶级的架构师，深知商业的本质和团队运作的规律。他们懂得：</p>
<ol>
<li><strong>好的设计，就是当你不能再拿走任何东西的时候。</strong> （正如评论区一位开发者所说：Good design is when you keep taking away things until you cannot take away any more.）</li>
<li><strong>永远不要在全局引入复杂性。</strong> 遇到性能问题，先用监控定位，然后把性能敏感的那 1% 的代码隔离出来，在这个小黑盒子里用最极客的方式优化，最后把它严丝合缝地封装好。</li>
<li><strong>拥抱不完美但高效的工具。</strong> 不要嫌弃 GC，懂得如何与 GC 和谐共处，才是真正的大师。</li>
</ol>
<p>如果下次你的团队里，再有人因为某个接口慢了 10 毫秒，就嚷嚷着要用 Rust 把整个几十万行的后端服务重写时，请把这篇文章甩到他的脸上。</p>
<p>告诉他：<strong>“去把 pprof 打开，把那 1% 循环里的临时变量给我复用了，然后早点下班回家。”</strong></p>
<p>资料链接：</p>
<ul>
<li>https://x.com/valyala/status/2055725885035045234</li>
<li>https://x.com/stewartlynch8/status/2055322205563617516</li>
<li>https://x.com/davidcrawshaw/status/2055288855792955511</li>
</ul>
<hr />
<p><strong>今日互动探讨：</strong></p>
<p>在你的职业生涯中，是否经历过为了追求所谓的“极致性能”或“极客审美”，而导致整个项目陷入“过度复杂化（Over-engineering）”灾难的时刻？或者，你在使用 Go 语言时，有什么私藏的“热路径”压榨技巧？</p>
<p><strong>欢迎在评论区留言和我探讨，我们一起对抗现代软件的“过度复杂病”。</strong> （如果你觉得这篇文章打破了你的认知，别忘了点赞转发，让更多挣扎在重构边缘的兄弟们看到！）</p>
<hr />
<p>还在为写 Agent 框架频频死循环、上下文爆炸而束手无策？我的新专栏 <strong>《<a href="http://gk.link/a/12IzL">从0 开始构建 Agent Harness</a>》</strong> 将带你：</p>
<ul>
<li>抛弃臃肿框架，回归“驾驭工程 (Harness Engineering)”的第一性原理</li>
<li>用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等，复刻极简OpenClaw</li>
<li>构建坚不可摧的 Safety Middleware 与飞书人工审批防线</li>
<li>在底层实现 Token 成本审计、链路追踪与自动化跑分评估</li>
<li>从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”</li>
</ul>
<p>扫描下方二维码，开启从 0 开始构建Agent Harness 的实战之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png" alt="" /></p>
<hr />
<p><strong>原「Gopher部落」已重装升级为「Go &amp; AI 精进营」知识星球，快来加入星球，开启你的技术跃迁之旅吧！</strong></p>
<p>我们致力于打造一个高品质的 <strong>Go 语言深度学习</strong> 与 <strong>AI 应用探索</strong> 平台。在这里，你将获得：</p>
<ul>
<li><strong>体系化 Go 核心进阶内容:</strong> 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏，夯实你的 Go 内功。</li>
<li><strong>前沿 Go+AI 实战赋能:</strong> 紧跟时代步伐，学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等，掌握 AI 时代新技能。 </li>
<li><strong>星主 Tony Bai 亲自答疑:</strong> 遇到难题？星主第一时间为你深度解析，扫清学习障碍。</li>
<li><strong>高活跃 Gopher 交流圈:</strong> 与众多优秀 Gopher 分享心得、讨论技术，碰撞思想火花。</li>
<li><strong>独家资源与内容首发:</strong> 技术文章、课程更新、精选资源，第一时间触达。</li>
</ul>
<p>衷心希望「Go &amp; AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚，享受技术精进的快乐！欢迎你的加入！</p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/05/18/go-performance-optimization-over-rust-rewrites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
