惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Cisco Talos Blog
Cisco Talos Blog
Y
Y Combinator Blog
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 聂微东
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
L
LangChain Blog
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
F
Full Disclosure
S
Schneier on Security
T
Tenable Blog
量子位
NISL@THU
NISL@THU
Latest news
Latest news
V
Visual Studio Blog
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
博客园_首页
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
美团技术团队
P
Proofpoint News Feed
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
S
Securelist
The Register - Security
The Register - Security
G
GRAHAM CLULEY
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
C
Cisco Blogs

Tony Bai

“皇帝的新衣”一年后:对话Thorsten Ball谈Agentic编程 告别标签页焦虑:我让 AI 帮我做了个浏览器插件 TabQueue Bun刚把Zig重写成Rust,这个团队却用487天反向重写 为了一个函数名,Go官方吵了两个月:maps.Same提案近日正式通过 Go 1.28 路线图首度曝光:Cgo 告别C工具链?泛型容器将入标准库? 掌控外环:为什么“循环工程”的边界必须由人类死守? 171个“已批准”却迟迟未实现的提案:Go语言的十年“欠账清单” 别再往 Go 里塞 Java 了:拆解 spf13 的 Idiomatic Go 信仰 AI 不在乎代码烂不烂,但你的Token账单在乎:一项660次实验揭示的编程新常识 10倍速 TypeScript 7.0 正式发布,前Go产品经理:Go才是AI智能体时代的“天选语言” Bun 重写为 Rust 后,Zig 之父罕见开炮:“我们早就等着看你重写” 全新 AI 技术栈:模型、Harness、Loop 与自我进化的智能体 AI 重写 Bun 为Rust全过程揭秘:101万行代码、11天、64个Claude并行开工 MCP Server 架构模式全解析:5 种模式、4 个反模式,与那条不能越过的“工具数量红线” 从手动 govanityurls + Nginx 迁移到 gvu:一次真实迁移记录 Go 私有模块拉取全解:凭据配置 + Vanity URL,个人与组织全覆盖 从“切歌小工具”到“零人工代码”:Claude Code 的诞生史,比科幻还科幻 如何使用 Claude Code 构建 AI 循环系统(Loops) 5 分钟上手 gvu:把 vanity import path 这件事,从“半天运维”变成一条命令 Go 对语言演化的保守态度,在未来 5 年是否仍然正确呢? 五年,三篇文章,一个我一直没真正解决的问题 每个 AI 工程师都应该知道的 20 个循环设计模式 cc-switch-cli:专为终端控与远程开发打造的 Claude Code 多模型切换工具! Andrej Karpathy 解析 Loop Engineering:构建“数日级”长程 Agent 的 9 条黄金法则 HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? 一个 Rust 项目吃掉 75GB 硬盘?聊聊 Go 与 Rust 的“缓存焦虑”与拯救指南 折腾过各种语言后,我为什么总是回到 Go 语言? YC 揭秘 AI 原生组织:打造一家在睡梦中自我进化的公司 从 WordPress 到 Hugo:一个 20 年技术博客的迁移实录 偿还十年技术债:深度拆解 Go 1.27 的 GODEBUG 强力清理计划 浏览器里的“安全阴谋”:为什么 Go 1.27 的 UUIDv7 会离奇丧失随机性? Go 1.27新特性前瞻:泛型方法落地,标准库内建 UUID - Tony Bai AI 正在撕裂研发团队:狂欢的“托管派”与心碎的“守夜人” - Tony Bai 屠榜 CNCF!为什么在云原生时代,Go 语言能把 Java、C++ 和 Rust 堵在门外? 上千程序员自爆 AI 的“卧槽时刻”:是推开神界大门,还是跌入黑盒地狱? - Tony Bai 大模型正在见顶!传奇架构师:欢迎来到“平坦曲线时代” - Tony Bai Anthropic 40万大样本揭秘:AI 时代为什么“专家”身价暴涨? - Tony Bai 在 AI 编码时代,为什么我们依然选择 Go 而不是 Rust? DeepMind 亮出王炸:别再手写 Agent Harness 了,AI 已经学会自己写了! 为什么说“编译通过,就能运行”?Google 专家 Alice 揭秘 Rust 的工程美学与底层逻辑 谷歌 SRE 重磅白皮书:当 AI 自动写出 10 倍代码,谁来阻止系统崩溃? 别再省 Token 了!硅谷新共识:浪费算力才是唯一捷径 - Tony Bai Linux 内核顶级维护者:写了 35 年 C,是 Rust 让我重新找回了编程的乐趣 拒领上亿、封杀 AI:Zig 之父为什么 10 年不发 1.0? 写地道的 Go 语言,是否能让你成为了一个更好的开发者? - Tony Bai RSA 将死?Let’s Encrypt 押注 MTCs 迎战后量子时代 C++ 的权力游戏:一部关于妥协、背叛与重生的“史诗神剧” - Tony Bai 终结十年纠结:Go 新提案允许 Example 支持任意函数签名 - Tony Bai 2026年,大厂重构核心系统为何集体投向 Go? - Tony Bai “辛辛苦苦考上985,却发现AI能替代我90%的工作”:今天的高考,我们还在为什么而战? - Tony Bai 传奇黑客 Geohot 炮轰 AI Agent:这是软件工程史上代价最昂贵的灾难! 别把 Go 写成 Java:毁掉项目从过度架构开始 - Tony Bai 开源维护者的困境 - Tony Bai AI 时代如何真正掌握一门新技术?这份非主流学习指南建议永久收藏 - Tony Bai Go 生态17年大浪淘沙:2026年最值得引入的10个“神仙级”QoL工具包 - Tony Bai 再见样板代码!Go 官方新提案:函数一键转接口 - Tony Bai 写代码快 10 倍,不等于研发快 10 倍!Google 揭秘 AI 系统级瓶颈 Google I/O 2026:Jeff Dean 携 DeepMind 众神宣告,AI Agent 正在终结“标准化软件”时代 AI 优化 1.5ms,手写 0.02ms!Ghostty 作者痛批 AI 编程“平庸陷阱” Redis 之父吐槽现代前端的复杂性:我们到底是在解决问题,还是在制造问题? - Tony Bai 无痛消灭技术债:Google I/O 2026 开启 Go 自动重构时代 省下 10% CPU!Uber 揭秘 Go 栈扩容的隐秘代价 从 Go 迁移到 Rust - Tony Bai 悄悄用 Go 重写 AI 基础设施:NVIDIA 的 GPU 云平台为何选择 Go? Shopify 23,000 名工程师背后的 Claude Code 配置方案(你可以直接复刻的完整配置) Google 开源 AX 与 Agent Substrate:构建以 Agent 为核心的云原生计算底座 十年难题终获突破:揭秘 Go 1.27 接口逃逸分析优化 - Tony Bai
别把“容易”当“简单”:Gin 框架作者撰文揭秘 88k Star 背后的架构哲学
Tony Bai · 2026-07-04 · via Tony Bai

题图

本文永久链接https://tonybai.com/2026/07/04/build-gin-simple-over-easy

大家好,我是Tony Bai。

在 2014 年那个 Go 语言(Golang)还未彻底统治云原生世界的年份,一个刚刚从旧金山搬回西班牙的年轻人 Manu Martínez-Almeida,正面临着人生的十字路口。

他打算开发一个名为 Fyve 的社交网络后端。因为喜欢 Go 语言那种“平淡无奇(plain)”的特质,他选择了 Go,并顺手写了一个 Web 框架作为该项目的底座。

戏剧性的是,社交网络 Fyve 早已在历史的尘埃中灰飞烟灭,但那个顺手写出的副产物—— Gin 框架,却在经历了十多年的岁月洗礼后,斩获了超过 88,000 个 GitHub Stars,成为了将近 30 万个 Go 语言项目的基石。

Gin 为什么能活这么久、这么火?在这个充斥着各种花哨特性的开源世界里,它的制胜密码是什么?

近日,Manu 撰文回顾了 Gin 的诞生历程。答案其实就藏在他深受 Go 语言先驱 Rob Pike 启发的一句话里:“Simple Over Easy(简单胜于容易)。”

今天,我们就来深度扒一扒,这八个字是如何塑造了 Gin 坚不可摧的架构底座的。

什么是 Easy?什么是 Simple?——与“魔法”的决裂

时间回到 2014 年。如果你在当时向 Go 开发者询问推荐哪个 Web 框架,几乎所有人都会指向一个名字:Martini

当你打开 Martini 的 README 时,你会立刻被它吸引。它的代码看起来极度“Easy(容易)”,寥寥几行就能让一个路由跑起来,中间件模型看起来优雅极了。

然而,这种表面上的“容易”,却包裹着致命的毒药:过度依赖基于反射(Reflection)的依赖注入

Manu 很快发现了 Martini 的灾难性缺陷。为了让开发者在写代码时感到“轻松”,Martini 在底层使用了大量的反射来强行绑定处理器(Handlers)。

  • 结果就是:当服务正常运行时,它像魔法一样丝滑;可一旦某个中间件或者请求发生了异常,控制流就会瞬间变得无法追踪(Hard to trace)。
  • 更可怕的是:每一次 HTTP 请求到来,这套沉重的反射机制都要被执行一次,导致性能极差。

这引发了 Manu 对 Rob Pike 著名演讲《Simplicity is Complicated》的深刻共鸣。

他也悟出了一个颠覆性的道理:看似容易(Easy)的软件,往往是因为它在底层替你隐藏了太多的魔法和运动部件(Moving parts);而真正的简单(Simple),是指系统底层的概念清晰透明,哪怕这意味着开发者在编码时需要稍微多写几行显式的代码。

Gin 就是在寻找这条“中庸之道(The middle ground)”。

当时原生的 net/http 太过简陋,没有路由参数解析,没有验证辅助,所有重复的管道代码(Plumbing)都要自己写,噪声极大。

Gin 填补了这个空白,但它绝对禁止在请求路径上使用反射

它引入了一个天才的设计:gin.Context

r := gin.Default()
r.GET("/users/:id", func(c *gin.Context) {
    id := c.Param("id")        // 显式获取路径参数,没有反射魔法
    c.JSON(200, gin.H{"id": id}) // 一次调用完成响应渲染
})
r.Run(":8080")

*gin.Context 携带了请求、响应写入器、路径参数以及渲染方法。它是请求在整个生命周期中传递的唯一对象

没有依赖注入,没有隐藏逻辑。普通操作只需一个方法调用,而且底层全是非常直白的 Go 代码,一旦生产环境出现诡异现象,你可以直接通过 IDE 步入(Step into)源码进行 Debug。

(有趣的是,gin.Context 在 2014 年发布时,Go 标准库里的 context.Context 甚至还没诞生。两年后标准库补齐了这一概念,Gin 顺势兼容了它。)

性能的密码:死磕 Radix 树的降维打击

让 Gin 一战成名的,是它在当时秒杀众生的极速路由性能。而这同样源自“Simple”的约束。

当时的许多框架(如 Martini)为了提供极致的路由灵活性,允许开发者使用正则表达式(Regexes)来定义路由。这确实很“Easy”,你可以让一个路由只匹配数字,或者隐藏极其复杂的匹配模式。

但代价是,框架在内部维护了一个正则列表。每来一个请求,都要去遍历询问这个列表:“是你吗?是你吗?”。这相当于在你的 Web 框架里,寄生了一门名为“正则表达式”的第二语言。

Gin 选择了极度的克制。它的路由语言非常小:只允许静态段、命名参数和全匹配通配符。

这种克制,使得 Gin 能够采用一种当时由 httprouter 带火的高效数据结构:Radix Tree(基数树/压缩前缀树)

在 Radix 树中,共享相同前缀的路由会被折叠在一起:

  • /search
  • /support
  • /blog/:slug
  • /blog/:slug/comments

当请求 /blog/42/comments 进来时,路由查找不需要遍历一个包含一万条正则的列表,它只需要顺着树干,依次走过 /blog/ -> 42 (:slug) -> /comments 节点。

这就是架构设计上的降维打击

  • 正则列表的查找成本:$O(n \cdot m)$ ($n$ 是注册的路由数量,$m$ 是正则长度)。路由越多,速度越慢。
  • Radix树的查找成本:$O(k)$ (独立于注册的路由总数,只与请求 URL 长度 $k$ 有关)。无论你的项目中有一百个路由还是一万个路由,查找速度几乎是恒定的。

极致的零分配艺术

性能不仅来自于算法,还来自于对内存的苛刻控制。

在 Gin 的设计中,当请求在树中游走到达最终叶子节点时,需要提取的路径参数(如上面的 42)会被直接放入一个预先分配好的切片(Slice)中。

那个贯穿始终的 Context 对象,也是从 sync.Pool 对象池中拿取并在请求结束后重置的。

这意味着什么?意味着在热路径(Hot Path)上,垃圾回收器(GC)几乎没有废料需要清理。系统延迟不再会因为 GC 的剧烈介入而产生波动。

正如 Manu 所言:“我之所以相信这种性能,是因为它的速度来源于‘做得更少’。而系统做得更少,也就意味着阅读源码的人需要理解的东西更少。”

最痛苦的克制:十年坚守“零破坏性更新”

如果说性能让 Gin 一炮而红,那么真正让它统治生态十年的,是它在开源治理上的“死板”。

Go 语言在 1.0 发布时,向世界做出了著名的“Go1 向后兼容承诺(Compatibility Promise)”。Manu 决定,Gin 也要向它的用户提供一模一样的契约。

这个约束彻底改变了框架设计的心理模型。

在合入任何一个公开 API 到主分支之前,作者都必须经受直击灵魂的拷问:“我愿意在接下来的十年里,一直忍受并维护这个 API 吗?”

  • 你必须学会拒绝。拒绝那些仅仅为了帮开发者节省 5 个字符输入、但会破坏命名的 PR。
  • 你必须将每一个暴露出去的公开函数,都视为“某个陌生人明天可能用来建立一家伟大公司的底层地基”。你不能随便把它拆掉。

这种约束执行起来是极其痛苦的。对于开源作者来说,频繁发布带着炫酷新特性的破坏性版本(Breaking Changes)能带来极大的成就感,而维护向后兼容往往意味着要咽下很多历史遗留的苦水。

但这带来了无可估量的信任红利。十多年前用 Gin 早期版本写的第一批服务,有些代码到今天甚至一行都不用改,依然能在最新的编译器下完美编译运行。这就是 Gin 后来能在 Hacker News 上爆火,并被各类企业核心业务大规模采用的终极原因。

小结:放手与超越

如今的 Gin,早已经不需要 Manu 亲自去写每一行代码了。它“毕业”了,被移交给了更加专业和热情的社区维护者,每天服务着数十亿计的网络请求。

这可能是所有开源项目最完美的归宿。

在文章的最后,Manu 给所有试图构建基础库的工程师留下了一段极具分量的忠告:

“如果你要设计一个库,把目标定得高一点。设计一个你能想象维护十年的 API,并让其底层极其简单透明(Simple underneath)。即使这会让你在初期实现时付出更加高昂的代价。因为只要你运气够好,这个东西最终会超越你个人的力量,长成参天大树。”

在追逐 AI 代码生成、“一秒钟写出一个微服务”的狂热时代里,Gin 的故事像一面镜子,提醒着我们:

永远别把“容易”当成了“简单”。真正伟大的系统,都是在隐忍与克制中,被一行行透明的代码雕刻出来的。

资料链接:https://manualmeida.dev/articles/gin-simple-over-easy/


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


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

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

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

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

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


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!


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