Gin 真的是“真菌”吗?—— 一篇引发热议的“反 Gin”檄文解读

本文永久链接 – https://tonybai.com/2025/12/12/gin-is-a-very-bad-software-library

大家好,我是Tony Bai。

“Gin 就像是一种伪装成软件库的阴险真菌:它很容易感染,一旦沾上就几乎无法去除,除非你极其小心,否则还会传染给你的朋友。”

2025 年 12 月,Efron Licht 发布了一篇名为《Gin 是一个非常糟糕的软件库》的长文,用词之激烈、抨击之全面,瞬间引爆了 Go 社区。他将 Gin 比作“真菌”,并列举了从代码膨胀到 API 设计混乱的种种“罪状”。

这篇文章虽然充满了情绪化的发泄,但它同时也触及了许多资深 Gopher 心照不宣的痛点。Reddit 上的热烈讨论证明了这一点:虽然很多人不喜欢作者的语气,但绝大多数人承认他的技术批评是站得住脚的

今天,让我们剥离情绪,结合社区的反馈,深入剖析这篇檄文背后的技术逻辑:作为 Go 生态中最流行的 Web 框架,Gin 真的有那么不堪吗?

第一宗罪:惊人的代码膨胀 (Code Bloat)

作者首先指出的,是 Gin 与其解决的问题之间巨大的比例失调

  • 标准库 net/http:仅用 2.5 万行 代码就实现了完整的 HTTP 协议栈(包含客户端、服务端、TLS 等)。
  • Gin:为了实现路由和中间件等相对简单的功能,其依赖树竟然引入了 87 万行 代码和 55MB 的体积!

更令人咋舌的是,Gin 的依赖树中包含了至少 6 个不同的 JSON 库(包括 sonic, go-json, ugorji/go/codec 等)。一名Reddit 用户 证实了这一点,并指出即使在不使用 msgpack 的情况下,Gin 也会引入巨大的二进制开销。虽然可以通过 -tags nomsgpack 来缓解,但这并非默认行为。

这种“把厨房水槽都装进去”的依赖管理方式,对于追求简洁和二进制体积的 Go 项目来说,确实是一个沉重的负担。

第二宗罪:混乱的 API 设计与“抽象泄漏”

作者对 Gin 的 API 设计进行了无情的嘲讽,称其“表面积像工业散热器一样大,而且一样吸热(sucks)”。

  • gin.Context 的过度设计:这个核心结构体拥有超过 133 个方法!它混杂了请求参数解析、响应写入、内容协商、Cookie 处理甚至 HTML 模板渲染等所有功能。一位Reddit 用户评论道:“Gin 就是当每一个可能的使用场景都塞进同一个库时发生的事情。”
  • 奇怪的方法签名:相比标准库清晰的接口,Gin 提供了数十种获取参数的方法,甚至还有 BindYAML, BindTOML 等特定的绑定方法。这种设计不仅增加了学习成本,也让代码的可测试性大打折扣。

第三宗罪:致命的“锁定效应” (Lock-in)

这是作者认为最严重的问题,也是将其比作“真菌”的核心原因。

  • 单向兼容性:你可以很容易地将一个标准的 http.Handler 包装成 Gin 的 handler。
  • 无法逃离:但如果你想从 Gin 迁移回标准库,或者是迁移到其他框架(如 Chi, Echo),你会发现几乎不可能。因为你的业务逻辑已经深度耦合了 *gin.Context 中那 100 多个特有的方法。

正如 一位Reddit 用户所言:“如果你想不付出巨大的开发者纪律和克制,就在 Go 中实现‘按需付费’(只引入需要的依赖),那几乎是不可能的。Gin 让事情变得简单,所以人们就用了它,尽管方式很糟糕。”

社区声音:不仅是批评,更是反思

Reddit 上的讨论为这场批判提供了更多元的视角:

  1. “标准库至上”派的胜利:许多用户表示,他们早已放弃 Gin,转而投向 EchoChi。Chi 因为其极简的设计(仅 1000 多行代码)和对标准库接口的严格遵守,被多次点名表扬。
  2. 对“中间件地狱”的共鸣:一名用户指出,虽然标准库很美,但它的中间件链和上下文处理确实不如框架方便。Gin 的成功在于它填补了标准库在人体工程学 (Ergonomics) 上的空白,尽管是以一种臃肿的方式。
  3. 初学者的陷阱:多位用户提到,AI(如 ChatGPT)往往会默认推荐 Gin 给新手,导致许多内部服务和 API 仅仅因为“AI 推荐”就染上了这种“真菌”。这加剧了 Gin 的锁定效应。

小结:我们还需要 Gin 吗?

Efron Licht 的批评固然犀利,但也存在幸存者偏差。对于初学者或快速原型开发来说,Gin 提供的“一站式”体验(路由、参数绑定、验证、JSON 序列化)确实极大地降低了门槛。

然而,随着 Go 标准库的不断进化(特别是 Go 1.22 引入了增强的 http.ServeMux),以及像 Chi 这样更轻量且优秀的替代品的成熟,原生开发的体验已经今非昔比

给 Go 开发者的一些建议:

  1. 对于新项目:建议评估 标准库 + ChiEcho。它们提供了更好的模块化和更小的依赖负担。
  2. 对于已使用 Gin 的项目:不要恐慌,但要警惕。在编写 handler 时,尽量将 *gin.Context 限制在最外层,将业务逻辑抽离到与框架无关的 Service 层中。
  3. 警惕“便利性”陷阱:在引入任何“全家桶”框架之前,问自己一个问题:我引入的这 55MB 依赖,真的只是为了少写几行 if err != nil 吗?

Go 的哲学是“少即是多”。Gin 在某种程度上,是对这一哲学的背离。这篇文章虽然激进,但它是一记警钟,提醒我们在享受便利的同时,不要忘记了软件工程中那些关于复杂性、依赖管理和可维护性的永恒真理。

资料链接:

  • https://eblog.fly.dev/ginbad.html
  • https://www.reddit.com/r/golang/comments/1pifcca/gin_is_a_very_bad_software_library/

还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

Linus 的名言要改了:Talk is cheap, show me the Spec

本文永久链接 – https://tonybai.com/2025/12/12/talk-is-cheap-show-me-the-spec

大家好,我是Tony Bai。

在 IT 行业,有一句被奉为圭臬的名言,出自 Linux 之父 Linus Torvalds:

“Talk is cheap, show me the code.”
(废话少说,放码过来。)

在过去的三十年里,这句话是绝对正确的。因为将人类的自然语言逻辑翻译成机器能运行的 C/C++/Go/Java 代码,是一项高难度、高成本的脑力劳动。代码,就是程序员的军功章,是能力的终极证明。

但是,站在 2025 年末的今天,当我们看着 Claude Code 或 Cursor 在几秒钟内生成了数百行逻辑严密、注释清晰的代码时,你是否感觉到了一种微妙的价值观崩塌

如果生产代码变得像呼吸一样简单,那么“Show me the code”还足以证明你的价值吗?

我认为,是时候修正这句话了。在 AI 原生开发时代,新的法则应该是:

“Talk is cheap, show me the Spec.”
(空谈廉价,请给我看你的规范说明书。)

价值倒置:代码的通货膨胀

为什么说 Code 变得 cheap(廉价)了?这符合基本的经济学规律:供需关系

  • 前 AI 时代: 代码的供给受限于程序员的打字速度和脑力带宽。优质代码是稀缺资源。
  • AI 时代: LLM 使得代码的供给趋近于无限。只要你给指令,AI 可以不知疲倦地生成无限吨位的代码。

当一个东西的供给变得无限时,它的价值就会无限趋近于零。

现在,你随便找个实习生,配上 AI 工具,他也能给你 Show 出一大堆 Code。但这些 Code 是垃圾还是黄金?能不能跑?符不符合业务需求?

这取决于“指令”的质量,而不是“代码”本身。

权力的转移:从“实现” 到 “定义”

在传统的软件工程中,权重最高的是 Implementation(实现)。我们推崇那些能搞定复杂算法、能手写汇编的大神。

但在 SDD (Spec-Driven Development) 兴起的当下,权力中心正在向 Definition(定义) 转移。

什么是 Spec (Specification)?

在 AI 时代,请务必注意:Spec 不再是那个单薄的 requirements.txt 或 README.md,它是广义的“全景蓝图(Blueprint)”。

参考业界前沿的 SDD 规范(如 spec-kit / openspec),一个合格的、能让 AI 准确执行的 Spec,通常包含 “SDD 三件套”

  1. The Context (语境/需求) —— spec.md

    • 定义 “What & Why”:业务逻辑是什么?输入输出接口定义(Interface)是什么?
    • 核心要素:用户故事、API 契约、非功能性约束(性能/安全)、领域知识(Domain Context)。
  2. The Strategy (策略/架构) —— plan.md

    • 定义 “How”:为了实现上述需求,我们需要修改哪些文件?数据流怎么走?
    • 核心要素:技术栈选择、文件变更拓扑图、伪代码(Pseudocode)、架构决策记录(ADR)。
  3. The Execution (执行/进度) —— tasks.md

    • 定义 “Steps”:将大象装进冰箱分几步?
    • 核心要素:原子化的任务清单(Atomic Checklist)。AI 每做完一步,就勾选一项。这能极大地降低 AI 的“遗忘率”和“幻觉率”。

Code 只是这套 Spec 的“编译产物”。

这就好比建筑行业:当砌砖机器人都普及了,“砌砖”这个动作就不值钱了。值钱的是包含效果图(Spec)、结构图(Plan)和施工进度表(Tasks)在内的完整蓝图

我们可以用一张架构图来展示这个“广义 Spec”的结构:

当你对 AI 说 “Show me the Spec” 时,你是在要求这三者的完整交付。 只有这样,AI 才能从一个“只会聊天的机器人”变成一个“使命必达的工程师”。

新的开发范式:Show me your Spec

让我们对比一下两种开发者的对话模式:

旧模式(Code-Centric):
* A: “这个功能怎么做?”
* B: “你看我这几行代码(Show Code),我用了一个递归……”
* 痛点: 陷入细节泥潭,难以维护,AI 容易写偏。

新模式(Spec-Centric):
* A: “这个功能怎么做?”
* B: “你看我的 Spec 文档(Show Spec)。我定义了数据结构,约束了异常处理流程,并列出了 5 个测试用例。然后我让 AI 实现了它。”
* 优势: 逻辑闭环,架构清晰,AI 能够一次做对(One-shot Success)。

在这个模式下,程序员的核心竞争力,从“How to implement”(怎么写代码),变成了“How to define”(怎么定义问题)。

你能写出多么严谨、清晰、无歧义的 Spec,AI 就能给你多完美的代码。

Spec 的精度,决定了系统的质量。

小结:做架构师,别做打字员

Linus 说 “Talk is cheap”,是因为当年的 Talk 无法直接转化为生产力。

但现在的 “Spec” 不是 cheap talk,它是可执行的指令(Executable Instructions)

在 AI 时代,请不要再沉迷于堆砌代码行数。

把那些繁琐的实现交给 AI。

你应该去思考架构,去定义边界,去编写 Spec。

下一次,当有人还在炫耀他手写了多少代码时,请淡定地告诉他:

“Code is cheap. Talk is cheap. Show me your Spec.”


如何写出让 AI 听话的 Spec?

道理大家都懂,但真到了实战中,很多人发现自己写的 Spec,AI 根本看不懂,或者生成的代码依然是一坨浆糊。

Spec 也是一门编程语言,只不过它的编译器是 LLM。

如果你想掌握这门“面向 AI 的编程语言”,学会如何编写高质量的 Prompt 和 Spec 文档,构建一套基于 Claude Code 的自动化流水线,欢迎关注我的极客时间专栏《AI 原生开发工作流实战》

在本专栏中,我将:

  • 定义标准: 公开我经过实战验证的 SDD (Spec-Driven Development) 文档模板。
  • 实战演示: 展示如何用一份详实完备的Spec,指挥 AI 完成一个项目模块的开发、测试与部署。
  • 思维升级: 帮你完成从 Coder 到 Architect 的关键跃迁。

别让你的才华浪费在廉价的代码实现上。扫描下方卡片,掌握定义未来的能力。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats