Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断

本文永久链接 – https://tonybai.com/2026/03/27/function-type-inference-should-work-in-all-assignment-contexts

大家好,我是Tony Bai。

在这个大模型(AI)写代码如喝水一般简单的时代,你有没有遇到过一种极其憋屈的场景:

你让 Claude Code 或者 Codex 帮你写了一段 Go 语言代码,逻辑清晰,结构优雅,连它自己都觉得这波操作满分。但当你满怀期待地按下 go run 时,Go 编译器却无情地丢给你一个红色报错:

cannot use generic function g without instantiation
(不能在未实例化的情况下使用泛型函数 g)

AI 沉默了,它不明白自己错在哪;如果你是个习惯了 Rust 那种“地表最强类型推断”的开发者,你可能会当场流下心酸的眼泪—— 在 Rust 里闭着眼睛都能推断出来的泛型参数,怎么到了 Go 里,它就突然变成了“残疾”?

如果你曾经被这个“诡异”的泛型报错折磨过,甚至因此怀疑过自己的智商,不要怪 AI 不懂 Go 语言。

因为就在最近,连“Go 语言之父之一” 的 Robert Griesemer 都亲自在官方 GitHub 上提了一个 Issue,承认这个语法限制不仅反直觉,甚至一度被认为是一个编译器 Bug!Griesemer 本人随即在 Issue 中自我更正,明确这需要语言规范(spec)层面的修改,而不只是修编译器。

今天,我们就来扒开这个在 Go 官方仓库引发热议的 Issue #77245,看看这个即将改变Go工程师日常编码的“底层规范级修补”,到底是怎么回事。

“薛定谔”式的类型推断

自从 Go 1.18 引入泛型以来,“不够聪明”的类型推断(Type Inference)就一直被开发者诟病。直到 Go 1.21 发布,官方宣称大幅增强了这部分能力:只要在赋值上下文中,目标类型是明确的,Go 就可以帮你自动推断出泛型函数的参数类型,不需要你手动写 g[int] 了。

这听起来很美好,对吧?

但现实是极其骨感的。我们来看看 Robert Griesemer 亲自给出的这个“薛定谔式的推断”的例子:

type S struct{ f func(int) }

func g[T any](T) {} // 这是一个简单的泛型函数

func _(s S) {
    s.f = g          // ✅ 没问题!Go 编译器智商在线,完美推断出 T 是 int

    s = S{f: g}      // ❌ 报错:不能在没有实例化的情况下使用泛型函数 g

    s = S{f: g[int]} // ✅ 没问题!必须手动写死 g[int]
}

看懂这个坑在哪里了吗?

当你写 s.f = g 的时候,编译器智商在线,它知道 s.f 需要一个 func(int),所以它机智地把泛型函数 g 实例化成了 g[int]。

但是(最气人的但是)!

当你使用结构体字面量 S{f: g} 进行初始化时,编译器却突然“智力下线”了。它死活推断不出 g 需要被实例化为 int,非逼着你极其啰嗦地写上 g[int]!

这种“一半聪明,一半智障”的表现,不仅存在于结构体里。在切片(Slice)、数组、Map,甚至是 Channel 的发送操作中:

type F func(int)
type A [10]F
type S []F
type M map[string]F
type C chan F

func g[T any](T) {}

func _() {
    var a A
    a[0] = g      // ok
    a = A{g}      // error: cannot use generic function g without instantiation
    a = A{g[int]} // ok

    var s S
    s[0] = g      // ok
    s = S{g}      // error: cannot use generic function g without instantiation
    s = S{g[int]} // ok

    var m M
    m["foo"] = g         // ok
    m = M{"foo": g}      // error: cannot use generic function g without instantiation
    m = M{"foo": g[int]} // ok

    var c C
    c <- g      // error: cannot use generic function g without instantiation
    c <- g[int] // ok
}

只要你使用了复合字面量(Composite Literals),这套“残疾”的类型推断就会集体失效。

为什么 Rust 和 AI 看了会沉默?

如果你去问一个 Rust 开发者:“目标结构体的字段类型 f func(int) 明明就摆在那里,Go 编译器为什么会看不见?”

Rust 开发者可能会拍着你的肩膀叹气。在 Rust 强大的类型推断系统面前,这种上下文推导简直是基本操作,根本不需要开发者操心。

而在如今 AI 辅助编程大行其道的时代,这个问题更加被无限放大。

大模型在学习了海量代码后,它的“直觉(Next-token prediction)”告诉它,这里上下文极其明确,根本不需要写死类型参数。于是 AI 开心地生成了 S{f: g},结果却被 Go 编译器无情打脸。你不得不停止思考,手动去把 AI 生成的代码一行行加上 [int]、[string]……

这根本不是 AI 的幻觉,而是 Go 语言规范(Spec)在当年设计时,由于过于严谨,给自己留下的思维盲区。

在最初的 Go Spec 中,关于泛型函数实例化生效的上下文规定得极其死板(只在某些直接赋值的场景生效)。当时的 Go 团队并没有抽象出一个统一的 “赋值上下文(Assignment Context)” 概念。这导致散落在各个角落的复合字面量操作,全都成了漏网之鱼。

官方的修补:一场牵一发而动全身的“规范手术”

起初,Robert Griesemer 以为这只是个单纯的编译器 Bug,只要改改代码就行了。

但随着讨论的深入,核心成员们(如 Austin Clements)发现,这事儿没那么简单。要从根本上解决这个问题,必须对 Go 语言规范(Spec)动刀子!

在随后的内部评审中,Go 团队做出了一个决策:

他们没有选择“头痛医头,脚痛医脚”地去给结构体、Map、切片分别打补丁。而是选择在 Go 语言最底层的定义——“可赋值性(Assignability)” 上做文章。

他们提出了一个新的 CL ,只要一个表达式符合“可赋值性”的校验(无论是等号赋值、结构体初始化、还是 Channel 发送),Go 编译器就必须启动泛型函数的自动类型推断。

这就好比给整个 Go 语言的类型推断系统,彻底打通了奇经八脉

小结

到这里,可能有开发者会问:“不就是少写几个 [int] 吗?至于这么大惊小怪吗?”

在几行代码的 Demo 里,这确实不是事。

但在大厂动辄十几万或几十万行的微服务源码中,当我们使用泛型去实现高阶的“工厂模式”、“回调注册”、“依赖注入”时,代码中会充斥着大量的结构体初始化和泛型函数传递。

如果没有统一的类型推断,原本极其优雅的代码,就会变成被各种中括号 [T, K, V] 塞满的“乱码”。

更少的手动类型标记,意味着更低的人类认知负荷(Cognitive Load),以及对 AI 代码生成工具更友好的兼容性。

Go 语言之所以能在一众花里胡哨的新语言中稳坐云原生霸主的交椅,靠的绝不仅是并发,更是这种对“代码清爽度”和“心智负担”极其克制、甚至有些偏执的追求。

好消息是,这个被开发者诟病已久的痛点,已经被 Go 官方提案评审委员会 “正式接受(Accepted)”

我们极有可能在即将到来的后续版本(比如Go 1.27)中,看到这段啰嗦的泛型代码彻底消失。

资料链接:

  • https://github.com/golang/go/issues/77245
  • https://go.dev/cl/751312

今日互动探讨:

在日常写 Go 泛型的时候,你还遇到过哪些让你觉得“Go 编译器简直是个智障”的奇葩场景?或者在对比 Rust/TS 时,你觉得 Go 的类型系统最需要补齐哪个短板?

欢迎在评论区疯狂吐槽与分享!


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

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

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


原「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 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

Rust 核心团队大吐苦水:求求你们别再用 AI 提交“垃圾 PR”了!

本文永久链接 – https://tonybai.com/2026/03/26/rust-project-perspectives-on-ai

大家好,我是Tony Bai。

在这个大模型狂飙突进的时代,只要在推特或者掘金上刷一刷,你几乎每天都能看到这样的“成功学”分享:

“我是如何用 Claude Code + 4.6 Sonnet 在一天内向知名开源项目提交了 10 个 PR 的!”

“用 Cursor 混 GitHub 绿点,原来这么简单!”

这些利用 AI 工具轻松突破“开源门槛”的开发者们,正在享受着前所未有的技术平权红利。

但你有没有想过,站在这些开源项目背后的核心维护者(Maintainers)们,正在经历着怎样的地狱?

Go核心团队拒绝 AI 署名,为AIGC 时代的Go项目划下的“工程红线”后,前不久,Rust 项目的核心开发者、语言设计团队负责人 Niko Matsakis 在内部发起了一场长达数周的“大摸底”,旨在收集 Rust 核心贡献者和维护者们对于 AI 辅助编程的真实看法。

目前阶段性地汇总出的这份长达 20 多页的内部讨论纪要,犹如一枚深水炸弹,撕开了“AI 编程繁荣”背后的残酷真相:毫无节制的 AI 生成代码,正在不可逆转地榨干 Rust 核心团队的精力,甚至将开源社区推向崩溃的边缘。

今天,我们就来扒开这份极其硬核的内部讨论,看看在这个世界上一贯严谨、对代码质量要求极高的社区里,顶级的Rust工程师们是如何看待、抵制、甚至反制 AI 编程的。

当 AI 沦为“盲目自信”的催化剂

在很多人的幻想中,AI 是小白进阶的导师,是帮你看懂复杂底层源码的引路人。

但在 Rust 维护者们的眼里,绝大多数情况恰恰相反:AI 正在沦为某些开发者盲目自信的催化剂。

一位Rust贡献者一针见血地指出了问题所在:

“AI 给那些原本心怀愧疚、不敢随便提交低质量代码的人,盖上了一个‘官方批准’的假印章。对于那些处于‘达克效应(指能力欠缺的人产生虚幻的优越感)’状态的开发者来说,AI 简直就是一剂催化剂。它极大地膨胀了他们的自信,却严重削弱了他们真正的能力。”

在传统的开源世界里,“提交 PR”是一项极其庄重的工作。你需要阅读庞大的代码库,理解设计哲学,甚至要为了改一行代码而去推演上下文的几百个变数。这种“艰难的门槛”本身就是一种过滤机制。

但现在呢?

你只需要把报错信息扔给大模型或专门的编码智能体,比如Claude Code,它会生成一段看起来“极度合理”、语法看似“完美无瑕”的 Rust 代码。你连这行代码底层的生命周期(Lifetime)都没看懂,就欢天喜地地点了 git commit。

你以为你是在为开源做贡献,其实你只是把“寻找代码中细微致命毒药”的工作,无情地转嫁给了那些用爱发电的 Rust 维护者。

被“AI 传声筒”折磨到崩溃的维护者

如果说 AI 生成的代码只是质量差,那维护者大不了直接关闭 PR 就可以了。真正让 Rust 核心团队感到绝望甚至想要“退网”的,是那些把 AI 当作“传声筒”的贡献者。

让我们来看另一个让核心成员愤怒到使用加粗字体的真实案例:

“一些贡献者甚至充当起了审查者(Reviewer)和大模型之间的‘传声筒’!他们复制我提问的 Review 意见,扔给大模型,然后把大模型生成的胡言乱语直接复制回来回复我。看在上帝的份上,求求你们停下吧!我想强调,这极其令人抓狂。这是导致我极度倦怠(Burn out)的头号因素!

开源项目不仅仅是一堆冷冰冰的代码,它更是一个“人与人交流、碰撞、建立信任”的社区(正如 Peter Naur 在经典文章《Programming as Theory Building》中所言)。

当维护者满怀期待地与你讨论某个特性的底层设计时,你却用极其冗长、没有营养、甚至充满幻觉的 AI 废话来敷衍他们。这不仅是在浪费时间,更是在无情地践踏开源社区最宝贵的“信任契约”。

另一位Rust贡献者的控诉则充满了无奈:

“我完全不知道该怎么解决这个问题:‘没错,你很快就生成了一段看起来很合理的代码,但它在微妙的细节上完全是错的,而现在你正在浪费所有人的时间去排查它’。”

在没有 AI 的时代,分辨垃圾代码很容易;但在 AI 时代,大模型最擅长的,就是把垃圾包装成米其林三星的模样端给你。

全面封杀,还是“用魔法打败魔法”?

面对这群不知疲倦的“AI 水军”,Rust 核心团队该怎么办?

在这份内部文档中,关于“如何对待 AI”的讨论,呈现出了极其撕裂的两种极端:

极端一:道德洁癖与坚决抵制

一些拥有极客精神的老兵认为,目前所有的 LLM 都是建立在“盗窃版权数据”的基础上的。不仅如此,大模型的训练正在消耗极度恐怖的能源,甚至让那些本该关闭的煤炭发电厂死灰复燃,加剧气候危机。

对于这些开发者而言,在 Rust 中拥抱 AI,就是对开源精神的背叛,是“令人作呕的”。他们主张全面封杀 AI 提交,并要求所有贡献者必须证明其代码完全由人类编写。

极端二:承认现实,用魔法打败魔法

但现实是残酷的。Niko Matsakis 等负责人非常清楚:“潘多拉的魔盒已经打开,堵是堵不住的。”

既然无法阻止人们用 AI 写 PR,那就想办法用规则甚至用 AI 自身来防御 AI。

在这场激烈的讨论中,Rust 团队提出了几项极具参考价值的“防御性架构与策略”,值得每一个饱受 AI 代码折磨的团队学习:

  1. 引入“反垃圾邮件”级的审查门槛:不再一视同仁地对待所有 PR。建立类似“Web-of-Trust(信任网)”的机制。只有当你在社区里通过人类交互证明了你的能力(提交过 N 次高质量代码)后,你的 PR 才会被优先审核。对于那些上来就提交上千行完美格式代码的陌生账号,直接打入冷宫。
  2. 强制签署“反 AI 免责声明”:在提交 PR 时,强制要求作者勾选确认:“我完全理解我提交的每一行代码,并能亲自回答 Reviewer 的任何问题;我没有直接复制大模型的回复来敷衍维护者。” 如果一旦发现充当“AI 传声筒”,立即实施封禁。
  3. 以毒攻毒,引入 AI 门卫:既然你们用大模型批量生成 PR,那我们就用大模型来做“初筛”。在人类 Reviewer 看代码之前,先让 AI Agent 去自动扫描那些“看似合理实则荒谬”的逻辑漏洞,直接打回重做。

AI 狂欢下的“零付费”收割

在整份纪要中,最让我感到扎心的一段话,是关于“开源维护者生存现状”的拷问。

目前,像 OpenAI、Anthropic 这样的 AI 巨头,估值动辄千亿美元。它们的模型能写出越来越好的 Rust 代码,很大程度上是因为它们疯狂吸收了 Rust 社区十几年积累的心血。

然而,当这些估值千亿的公司推出“编程 Agent”,导致开源社区的维护工作量呈指数级爆发时,那些没日没夜帮这些“AI 垃圾代码”擦屁股的 Rust 核心维护者们,却拿不到一分钱的报酬!

一位核心成员悲愤地提议:

“也许我们应该直接去找那些 AI 公司(他们内部也在大量使用 Rust),要求他们出资赞助我们的维护者。虽然很多人在道德上抵制这些公司,但我依然希望拿他们的钱来养活我们的兄弟们。”

这就好比一家巨无霸外卖平台,每天把几十万份外卖倾倒在你的社区门口,然后让社区里那些没有工资的清洁工志愿者去疯狂打扫。

在 AI 巨头狂欢的盛宴下,开源世界的基石正在被悄无声息地榨干。

小结:退潮之后,谁在裸泳?

这份长达 20多 页的讨论,给所有沉浸在“AI 改变命运”幻觉中的开发者敲响了一记震耳欲聋的警钟。

不可否认,AI 确实是极其强大的工具。文档中也有不少成员承认,使用 AI 让他们感到了“赋能(Empowered)”,让他们能轻松搞定平时不愿意碰的繁琐文档和构建脚本。

但工具的强大,永远无法掩盖使用者的平庸。

当你可以用 Claude Code 在 10 秒内生成一段精妙的多线程 Rust 代码时,请记住:

只有当你真正懂所有权(Ownership)、懂借用检查(Borrow Checker)、懂底层内存布局,并且能在发生诡异 Panic 时独立完成 Debug 的那一刻,这段代码才真正属于你。

否则,你不过是 AI 巨头商业版图上,一个毫无感情的、廉价的“代码搬运工”。

不要用战术上的(生成代码)勤奋,去掩盖战略上的(底层认知)懒惰。

在代码生成的迷雾中,保持清醒的头脑,去深钻那些 AI 无法替代的系统级设计思维和底层工程哲学,才是我们在大模型时代唯一的生路。

资料链接:https://nikomatsakis.github.io/rust-project-perspectives-on-ai/feb27-summary.html


今日互动探讨:

在你的日常开发或开源贡献中,有没有被同事或陌生人提交的“AI 垃圾代码”狠狠坑过?你觉得开源社区应该全面封杀 AI 代码,还是张开双臂拥抱它?

欢迎在评论区疯狂吐槽与分享!


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

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

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


你的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 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! 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