<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>AsyncAwait on Tony Bai</title><link>https://tonybai.com/tags/asyncawait/</link><description>Recent content in AsyncAwait on Tony Bai</description><generator>Hugo</generator><language>zh-cn</language><copyright>2004-2026 Tony Bai. 版权所有.</copyright><lastBuildDate>Mon, 29 Jun 2026 07:00:00 +0800</lastBuildDate><atom:link href="https://tonybai.com/tags/asyncawait/index.xml" rel="self" type="application/rss+xml"/><item><title>折腾过各种语言后，我为什么总是回到 Go 语言？</title><link>https://tonybai.com/2026/06/29/keep-returning-to-go-no-matter-how-many-languages-i-try/</link><pubDate>Mon, 29 Jun 2026 07:00:00 +0800</pubDate><guid>https://tonybai.com/2026/06/29/keep-returning-to-go-no-matter-how-many-languages-i-try/</guid><description>本文探讨了资深开发者在尝试多种编程语言后，为何最终倾向于回归 Go 语言的深层工程原因。作者指出，现代开发生态中的“技术栈焦虑”常源于过度选择导致的决策疲劳与复杂的语言特性，而 Go 凭借其“自带电池”的标准库、开箱即用的高性能诊断工具（pprof）、简洁统一的“无色函数”并发模型以及对代码可读性的极致追求，为开发者提供了一个稳定且低认知负载的避风港。文章通过对比 Java、Rust 等语言，强调了对于生产级分布式系统而言，代码的“无聊”与可预测性远比语法层面的炫技更具工程价值，指出 Go 是现代软件工程中平衡开发效率与运维安全的最佳实践。</description><content:encoded><![CDATA[<p><img alt="题图" loading="lazy" src="/images/wp-content/uploads/2026/keep-returning-to-go-no-matter-how-many-languages-i-try-1.png"></p>
<p><a href="https://tonybai.com/2026/06/29/keep-returning-to-go-no-matter-how-many-languages-i-try">本文永久链接</a> – <a href="https://tonybai.com/2026/06/29/keep-returning-to-go-no-matter-how-many-languages-i-try">https://tonybai.com/2026/06/29/keep-returning-to-go-no-matter-how-many-languages-i-try</a></p>
<p>大家好，我是Tony Bai。</p>
<p>在软件开发的世界里，程序员们似乎永远处于一种“技术栈焦虑”中。</p>
<p>我们每天都在被各种新兴的、炫酷的编程语言所轰炸：</p>
<ul>
<li><strong>Rust</strong> 承诺了极致的内存安全与零成本抽象；</li>
<li><strong>Elixir/Erlang</strong> 实现了高度契合 Actor 模型的并发机制；</li>
<li><strong>Zig 和 Odin</strong> 试图用现代化的思维去重新定义 C 语言底座；</li>
<li><strong>C# 和 Kotlin</strong> 在语法糖和多平台融合上玩出了新高度。</li>
</ul>
<p>作为一个有追求的开发者，你兴致勃勃地去学习它们，试图在新的语法糖、复杂的宏（Macros）和玄妙的类型系统（Type Systems）里寻找编程的终极真理。但往往在经历了无数个折腾依赖、对抗编译器、排查黑盒内存泄露的深夜后，你会感到一种深深的工程疲惫。</p>
<p>最近，在 Reddit 的 <code>r/golang</code> 社区，看到<a href="https://www.reddit.com/r/golang/comments/1u5mj8h/no_matter_how_many_languages_i_try_i_keep/">一个引发众多点击和共鸣的帖子</a>：《无论我尝试了多少种语言，我最后总是回到 Go。（No matter how many languages I try, I keep returning to Go.）》</p>
<p>为什么一门常常被嫌弃“简陋”、“枯燥”的语言，会成为很多资深工程师在历经沧桑后的避风港呢？在这场硅谷大厂老炮的集体坦白局中，我提炼出了四个震慑心灵的系统级工程真相，供大家参考和反思。</p>
<p><img loading="lazy" src="/images/wp-content/uploads/2025/paid/go-concurrency-mental-model-qr.png"></p>
<h2 id="消除决策疲劳为什么-go-的标准库才是开发者的避风港">消除“决策疲劳”：为什么 Go 的标准库才是开发者的避风港？</h2>
<p>写过现代前端或 Rust/Python 的人，大概率都患有严重的“包选择困难症（Dependency Fatigue）”。</p>
<p>在 Reddit 的讨论中，一位开发者一针见血地指出：</p>
<blockquote>
<p><strong>“Go 的标准库，彻底消灭了你在其他生态中为了‘选择哪个第三方包来实现同一个简单功能’而产生的无尽决策疲劳。”</strong></p>
</blockquote>
<p>在其他语言里：</p>
<ul>
<li>想发个 HTTP 请求？你得在十几个第三方库里对比、筛选，最后引入一个可能带着几百个间接依赖的重量级 Crate/NPM 包。</li>
<li>想解析 JSON、做加密、写个简单的日志？你必须不断地上网查评测，生怕引进了有安全漏洞的第三方库。</li>
</ul>
<p>而在 <strong>Go</strong> 中，这一切都不存在。</p>
<p>Go 的标准库被称为 <strong>“Batteries included（自带电池）”</strong>。从高性能的 <code>net/http</code> 到极其安全的 <code>crypto</code>，再到开箱即用的 JSON 编解和模板引擎。Go 官方在底层为你写好了最标准、最地道的实现。</p>
<p>你不需要做任何纠结，直接 <code>import</code> 即可。<strong>这种对“决策开销”的极致克制，让开发者能够把百分之百的脑力，专注在解决业务问题上。</strong></p>
<h2 id="遥遥领先的诊断生态两周的-jvm-排障-vs-两个小时的-pprof">遥遥领先的诊断生态：两周的 JVM 排障 vs 两个小时的 pprof</h2>
<p>在生产环境中，最考验一门语言和其运行时的，不是“写代码有多爽”，而是“线上出问题时，你有多快能定位它”。</p>
<p>发帖主分享了一个让他彻底对 Scala 绝望、转而对 Go 死心塌地的真实惨剧：</p>
<p>在一次线上事故中，他负责的一个 Scala/JVM 应用程序发生了极其隐蔽的内存泄漏。为了定位这个漏洞：</p>
<ul>
<li>他不得不折腾各种复杂的 JVM 启动参数；</li>
<li>在测试环境搭建昂贵的诊断智能体（Agents）；</li>
<li>整整花了两个星期的时间，才勉强定位到堆内存的异常。</li>
</ul>
<p>“然而，如果这个事情发生在 Go 里，”他写道，“<strong>我只需要直接调用内置的 <code>pprof</code> 和运行时分析工具，甚至不需要任何第三方依赖，几小时内就能在火焰图里把内鬼揪出来。</strong>”</p>
<p>Go 将诊断和调试（Diagnostics）视为了语言的一等公民。你不需要配置任何繁琐的 APM（应用性能监控）插件，仅仅通过一行 <code>import _ &quot;net/http/pprof&quot;</code>，你就能拿到世界顶级的运行时追踪、CPU 与内存 Profile。这种对线上生产环境的敬畏，只有真正经历过半夜三点 On-Call 的工程师才能懂。</p>
<h2 id="终结异步红蓝战役go-的无色函数美学">终结异步红蓝战役：Go 的“无色函数”美学</h2>
<p>在现代编程语言中，为了支持并发，几乎大家都引入了 <code>async/await</code> 关键字。但这一设计，在无意中引入了著名的“<a href="https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/">函数染色问题（What Color is Your Function）</a>”。</p>
<p>在 JavaScript、Python等语言 中，函数被分为了两种颜色：</p>
<ul>
<li>蓝色（Synchronous 同步函数）</li>
<li>红色（Asynchronous 异步函数）</li>
</ul>
<p>致命的规则是：同步函数（蓝色）无法直接 await 异步函数（红色）的结果。一旦某个底层函数变为异步，调用它的上层函数也必须声明为 async，这种向上传染的特性会蔓延整个调用链，导致大规模重构。</p>
<p>而 <strong>Go 语言，彻底终结了这场红蓝战役——Go 的函数是“无色”的。</strong></p>
<p>在 Go 的世界里，所有的函数在语法上完全一致。你不需要写任何 <code>async</code>，不需要考虑 <code>await</code> 的阻断。</p>
<p>如果你需要并发执行，你只需要在调用前写一行：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">go</span> <span style="color:#a6e22e">doSomething</span>()
</span></span></code></pre></div><p>底层的 GMP 运行时调度器会自动帮你处理非阻塞 I/O、上下文切换和线程复用。这种在语言设计层面对“无色函数”的坚守，让 Go 拥有了干净、符合人类直觉的并发逻辑。</p>
<h2 id="编程应当是枯燥的告别代码炫技">编程应当是“枯燥”的：告别代码炫技</h2>
<p>很多有 5 年以上开发经验的程序员，总喜欢在代码里寻找“优雅”和“精妙”。他们喜欢 Rust 复杂的类型论、Scala 繁复的函数式元编程，或者 C# 各种新奇的语法糖。</p>
<p>但一位拥有 20 年经验的老兵写道：</p>
<blockquote>
<p><strong>“写了 20 年代码，我现在觉得编程应当是无聊的。我不想要任何惊喜，不想要任何炫酷的写法。代码只是解决问题的手段，而不是目的。写 Go，让我觉得我写出来的、和别人写出来的代码，长得一模一样，这种熟悉感无可替代。”</strong></p>
</blockquote>
<p>Go 语言在设计之初就刻意进行了“自我阉割”，拒绝了一切花哨的魔术语法。这带来的结果是：</p>
<ul>
<li><strong>极低的认知负载</strong>：你在阅读一个复杂的 Go 开源项目（比如 Kubernetes）时，你不会因为看不懂某个黑魔法宏定义而卡壳。</li>
<li><strong>极高的团队协作效率</strong>：由于没有个性的施展空间，团队里任何一个人写出来的 Go 代码都遵循着高度统一的标准。Code Review 不再是审美辩论，而是纯粹的逻辑审查。</li>
</ul>
<h2 id="小结">小结</h2>
<p>技术的世界喧嚣而繁华，每一年都有新的神话诞生。但当潮水退去，那些真正承载着公司业务运转、需要每天面对高并发流量和凌晨报警的一线工程师们，最终都会看清：</p>
<p><strong>最好的语言，并不是那个能让你在写代码时感到最炫酷的语言，而是那个能让你在系统维护和深夜排障时感到最安心的语言。</strong></p>
<p>Go 语言用它的“无聊”、“无色”和“克制”，为我们提供了一个返璞归真、脚踏实地的庇护所。它让我们重温了编程最初的目的——<strong>用最简单的方式，解决现实世界的问题。</strong></p>
<p>资料链接：https://www.reddit.com/r/golang/comments/1u5mj8h/no_matter_how_many_languages_i_try_i_keep/</p>
<hr>
<p><strong>💬 今日开放讨论：</strong></p>
<p>代码的精妙在于解决问题，而不是在语法上炫技。面对这场“折腾过后重回极简”的技术共鸣，我们也想听听你在一线最真实的工程感受：</p>
<ol>
<li>你是否有过为了在项目里选择一个路由或加密库，在 GitHub 上纠结对比三天三夜的经历？Go 语言那“自带电池”的标准库，是否真的帮你治好了“决策疲劳”？</li>
<li>如何看待 Go 的“无色函数”设计？在写过了各种被 <code>async/await</code> “染色”污染的其他语言代码后，你是否同意 Go 的并发设计才是符合人类直觉的？</li>
<li>“优秀的工程代码应该写得枯燥无聊，而不是充满魔法。” 对于这句话，作为一线开发者的你，是赞同还是反对？</li>
</ol>
<p>欢迎在评论区留下你最硬核的观点，或者把这篇文章一键转发给身边还在为“技术栈选型”纠结的码农朋友。我们评论区见！</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 loading="lazy" src="/images/wp-content/uploads/2026/build-agent-harness-from-scratch-qr.png"></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 loading="lazy" src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg"></p>
<hr>
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img loading="lazy" src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png"></p>
<!-- 
公众号地址：https://mp.weixin.qq.com/s/Q_Xf1WBoHa4dTAwvOKyz_Q
-->
]]></content:encoded></item></channel></rss>