本文永久链接https://tonybai.com/2026/08/31/go-hate-where-its-moving-generics-iterators-debate

大家好,我是Tony Bai。

【导读】

Go语言一直靠“简单”两个字圈粉。十几年来,它几乎没有大动作,语法小到一页纸能写完。但最近,一篇发在r/golang的吐槽帖,把这份“简单”撕开了一道口子——泛型来了,迭代器来了,内置集合类型的提案也来了。有人说这是Go在成长,也有人说,这是Go在“叛变”。

【文章要点】

  • Go语言以“少即是多”立身,十余年里几乎没有大改动,但从泛型(Go 1.18)开始,语言核心的边界被逐渐打开;
  • 最新的争议焦点是迭代器(range-over-func)和刚刚提出的内置集合类型(Set等)提案
  • 反对者担心Go会重蹈Java、C++“功能膨胀”的覆辙,赞成者认为这是语言走向成熟、弥补历史缺陷的必经之路;
  • 讨论中一个有意思的视角:语言本身没有强迫任何人使用新特性,但团队协作代码风格趋同的压力,让“不用新特性”在现实中很难做到;
  • 更深一层的争论指向了软件工程文化本身——是“克制”重要,还是“表达力”重要。


一石激起千层浪:一篇吐槽帖引爆Go社区

事情的起点,是Reddit上r/golang板块的一篇帖子,标题很直接:《I hate where Go is moving》(我恨Go现在的样子)。

发帖人是一位老Go用户,开篇就把话挑明:Go原本的设计目标,是让人不用操心Spring那种依赖注入体系,也不用先学一堆库里的方法才能上手写代码。可事情的走向和当初设想的完全不一样——用惯了Go的简单之后,人们开始索要“更高级”的特性,比如迭代器、泛型,然后写出了越来越像Kotlin、Java的代码。他举了一个例子:现在满屏都是类似 req.GetSomething.OrDefault(2) 这样的链式调用,一股浓浓的Java味。

这条帖子在12小时内拿到了数百个赞、200多条评论,评论区的讨论热度远超帖子本身,最终演变成一场关于“Go到底应该长成什么样”的大混战。

楼主的核心论点:Go正在“java化”

楼主的吐槽并不是空穴来风,他也承认Go早期确实存在一些设计问题——比如没有语言级别的可选类型(optional)。但他真正想要的,是让指针专门用来处理引用和修改语义,而不是被拿来解决“值可能不存在”这种可空性问题。

让他更不满的是社区的应对方式:现在到处能看到开发者自己造的“可选值”包装类型,而最近社区里又提出了给标准库加内置集合类型(比如Set)的提案——在他看来,这基本就是在把Go一步步改造成Java的样子。

这个论点精准地踩中了Go社区多年来最敏感的一根弦:Go的护城河,从来不是性能,也不是并发模型,而是“简单”本身。一旦“简单”这个标签开始松动,随之而来的身份焦虑几乎是必然的。

正方 vs 反方:这场争论到底在吵什么

评论区很快分成了泾渭分明的两派。

反对新特性的一方认为,Go之所以吸引人,恰恰是因为它“做得少”。有评论直言,很多人抱怨Go缺这缺那,本质上是把“会用很多种语言”当成一种炫技,却根本不理解什么是Go的idiomatic写法。C++就是前车之鉴——为了迎合所有人的口味,不停加特性,最后谁都不满意。

也有评论把矛头指向了具体的技术后果:Go的泛型实现方式导致方法不能作为接口的一部分声明,因为要么放弃值类型,要么就得引入运行时代码生成(JIT),这在他们看来正是“为了加特性而加特性”的典型代价。

支持演进的一方则给出了针锋相对的反驳。一条获得324个赞的高赞评论直接开怼:完全想不明白迭代器或者泛型到底哪里“有问题”,尤其是在处理数据流或者数据库读取这类场景时。评论区里更尖锐的声音指出,很多人拿“保持简单”当挡箭牌,本质上只是不想花时间去学习和理解新东西——而反对迭代器,恰恰是“对工程学的无知”。

还有一条被广泛引用的评论把逻辑讲得更透:喜欢用“简单”当借口反对一切新东西的人,往往忽略了一个事实——语言本身从来没有强迫任何人使用泛型。写了这么多年Go代码,也就在少数排序类场景用过泛型;用不用,是开发者自己的选择,跟语言“变没变”是两码事。

这场交锋的核心分歧,其实可以归纳成一句话:“语言提供的能力”和“开发者被迫接受的复杂度”,到底该由谁来负责?

深层追问:变的到底是语言,还是写Go的人

讨论往下走,逐渐脱离了语言特性本身,转向了一个更本质的问题——Go社区里到底是谁在写“不像Go”的代码。

一条获得高赞评论提出了一个很有意思的视角:真正让语言变得难用的,往往不是迭代器或泛型这类特性本身,而是运行时反射(reflection)带来的“魔法”——那种让你没办法从头到尾顺着代码读下去的隐式行为。很多人吐槽Java难用,其实吐槽的根本不是泛型或者面向对象,而是Spring、Guice这类依赖注入框架制造出的“隐形依赖链”。

这个观点得到了不少呼应。有评论直接点名,说很多加入Go项目的人,本身就是被公司从Java团队“发配”过来的,写惯了Java那一套设计模式,到了Go里依然习惯性地造工厂、造抽象层,最后把Go代码也写成了“Java翻译版”。历史仿佛在重演——当年C语言程序员被迫改用C++,如今换成了Java程序员被迫改用Go,剧本换了个语言,问题换汤不换药。

这条思路把问题从“Go变了没有”彻底转移到了:语言的“简单”从来都不是绝对的,它是由使用者的能力、习惯和代码审查文化共同撑起来的。语言层面的克制,挡不住工程文化层面的膨胀。

一图看懂:Go“简单主义”的演进路径

从社区讨论中可以看到,Go自诞生以来经历了几个关键的“边界松动”节点,每一次都伴随着类似的争议:

从这张图可以看出,争论并不是突然爆发的——它是Go每一次“加东西”时都会重演的固定剧本,只是这一次,讨论的强度和参与人数都明显更高。

高赞观点精选:社区众生相

除了正面交锋,评论区里还有不少角度刁钻、或者干脆“毒舌”的观点,很能代表社区的真实情绪:

  • 务实派:有开发者直言,代码写得烂不是语言的锅,是水平不够、代码审查不到位。Go允许你写烂代码,但从来没规定你必须写烂代码。
  • 玩梗派:有人调侃说,这就是“程序员版的NIMBY”(邻避效应)——自己用过的特性理所当然,别人想要的特性就是“过度设计”。
  • 和事佬派:Go项目本身的规矩很保守,每一次改动都非常克制,也会提前争取社区的广泛认同;泛型就是个好例子,用得好确实能减少不少样板代码,用不好也没人逼你用。
  • 反思派:也有评论承认自己就是那种“Java翻译腔”写法的践行者,并不为此感到骄傲,只是苦于社区里始终缺少一份清晰的“什么才是地道Go代码”的参照标准。
  • 看戏派:还有评论调侃说,这种关于Go走向的讨论,几乎每隔几天就会在论坛上重演一遍,堪称r/golang的“保留节目”。

值得一提的是,讨论里还夹杂了一个略带荒诞感的插曲——有人调侃说,反正现在写代码的是AI,人类只负责管需求和测试,语言选型的争论意义已经没那么大了。这条评论被顶了上去,也被喷了下去,本身就是这场讨论情绪张力的一个缩影。

写在最后:所谓“简单”,到底是谁的简单

这场发生在r/golang的争论,表面上是在吵泛型、迭代器、集合类型这些具体特性,实际上戳中的是一个所有成熟语言迟早都要面对的问题:当一门语言的用户规模从“早期极客”扩展到“大规模工程团队”,它原本的设计哲学,还能不能原样保留?

Go选择的路径,一直是极其克制的渐进式演进——每一个特性从提出到落地,往往要经历数年的社区拉锯。这种慢,恰恰是它区别于C++式“功能军备竞赛”的地方。但慢不代表不变,而“变”这件事本身,注定会让一部分为“简单”而来的老用户感到被冒犯。

或许正如讨论里一条评论所说:简单,要么活在语言本身里,要么活在开发者写的代码里。Go现在做的事情,某种程度上只是把这条边界重新交还给了社区去协商——而协商,从来都不是一件让所有人都满意的事。

你怎么看这场争论?是站“克制派”,还是站“演进派”?欢迎在评论区聊聊你眼中“地道Go代码”应该是什么样子。

资料链接:https://www.reddit.com/r/golang/comments/1w1281n/i_hate_where_go_is_moving/


还在为写 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技能再上一个新台阶!


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