记录:短函数字面量提案 #21498 落地后可大幅简化本库调用点样板
@smallnest đang làm issue này rồi.
Từ ngày 28/6/2026.
Đánh giá
Issue này chưa được đánh giá.
Mô tả
背景
本库是回调密集型:几乎所有中间/终结操作(Map/Filter/FlatMap/Reduce/Fold/ForEach/Sort/...)都以函数为参数。当前 Go 的函数字面量必须显式写出参数与返回类型,即便它们已能从上下文推导,导致调用点重复且冗长:
seq.From([]int{1, 2, 3, 4}).
Filter(func(n int) bool { return n%2 == 0 }). // int, bool 已可从 Filter 推导
Map(func(n int) int { return n * n }). // int, int 同上
Reduce(0, func(acc, n int) int { return acc + n }) // acc, n, int 同上
本文档记录上游提案 golang/go#21498(short function literals)—— 若实现,可大幅消除本库调用点的这类样板。
上游提案 #21498:short function literals
golang/go#21498 —— proposal: spec: short function literals(作者 Damien Neil / neild,2017-08 提出,OPEN,milestone Proposal,带 LanguageChangeReview 标签,截至 2026 年仍 pending,无最终接受形式)。
提案核心:引入一种轻量匿名函数字面量,当编译器能从上下文(被赋值/传入的函数类型)推导时,可省略参数与返回类型。提案原文对照(Scala/Rust 先例):
compute((x, y) => x + y) // 参数类型省略
compute(|x, y| { x + y }) // 参数与返回类型省略
语法窄结论(尚未最终定稿)
经近 1000 条评论与 LanguageChangeReview,Griesemer 在 2025-06-04 的总结评论(#21498#issuecomment-2941432763)收敛到一个「可工作的窄结论」,倾向箭头形式:
- 参数段统一为
(params)(Go 最自然的写法); - 用箭头区分短字面量与普通函数字面量,形如
(params) => {statements}或(params) => expr; - 用户最核心诉求是不重复参数类型,其余(如表达式体、
...处理)为附加收益; - 具体前缀/中缀、
=>vs->、gofmt 风格等细节仍未最终敲定。
⚠️ 状态澄清:部分媒体标题(如「Go is finally getting lambdas」)较乐观,但 #21498 至今未接受。HunCoding 的客观表述是:把「Go got lambdas」标题当作进行中的讨论,而非已发布特性(来源)。本 issue 按「pending 提案」对待。
对本库的简化
#21498 落地后,上述调用点可改写为(以箭头窄结论语法示意,最终语法以提案为准):
seq.From([]int{1, 2, 3, 4}).
Filter((n) => n%2 == 0).
Map((n) => n * n).
Reduce(0, (acc, n) => acc + n)
收益量化(本库现状,go1.27rc1):
- 库内 58 处
func(...)类型参数的高阶操作签名 —— 这些操作的调用点是主要受益面; - 测试中 125 处冗长
func(x int) bool {...}字面量参数,绝大多数可缩短为单表达式箭头; docs/示例与README的链式片段可读性显著提升(本库卖点正是「左到右读数据流」,每步一个func(...) {...}是当前最大噪声)。
注意边界:#21498 是调用点语法糖,不改变本库 API 形状或类型系统能力。它不能解决 #44(Zip 实例化循环)或 #45(约束子类型)那种需要类型系统演进的限制 —— 那两个分别依赖 golang/go#80172 与 golang/go#65394。三者互补:#21498 消除调用样板,#65394 消除子类型样板,#80172 决定 Zip 能否成方法。
验收 / 跟踪
- 现状已记录:本库回调密集,调用点冗长
func字面量是主要可读性噪声 - 与上游提案的对应关系已厘清:#21498 short function literals,语法窄结论为箭头形式但未最终定稿
- 跟踪 golang/go#21498:若被接受并落地(Go 1.x),则本库可:
- 将测试(125+ 处)与文档示例中的
func(x T) U { ... }改写为短字面量; - 评估是否在
README/docs推荐新写法作为惯用法; - 库 API 本身无需改动(纯调用点收益)。
- 将测试(125+ 处)与文档示例中的
- 若 #21498 被拒绝,则本库调用风格定型为显式
func字面量,本 issue 关闭
Type
docs / tracking · 优先级 low · 关联上游 golang/go#21498
相关
- 代码:
intermediate.go/terminal.go/funcs.go(高阶操作签名)、*_test.go(调用点样板) - 文档:
README.md/README_CN.md、docs/en.html/zh.html(链式示例片段) - 上游:golang/go#21498(本 issue 对应提案)、Griesemer 语法窄结论评论
- 媒体资料(客观口径,标题较乐观):HunCoding — Go and lambdas: eight years of debate around #21498、huizhou92 — Go is finally getting lambdas (Cloudflare 保护,正文与官方一致表述为进行中)
- 同类跟踪 issue:#44(Zip 实例化循环,跟踪 golang/go#80172)、#45(约束子类型,跟踪 golang/go#65394)—— 三者共同构成「用设计手段绕开/等待 Go 泛型与语法演进」的记录
- Ngôn ngữ chính
- Go
- Star
- 69
- Fork
- 1
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của smallnest/seq
-
记录:为何使用约束子类型 SeqComparable/SeqOrdered/SeqNumeric(模拟上游 #65394 refined method constraints)Có thể làm lại được @smallnest đã nhận 120 ngày trước và không có pull request nào đang mở. Đang mởdocs priority: low
-
记录:Zip/Zip3/Zip4 为何暂不可由自由函数改为方法(跟踪上游 golang/go#80172)Có thể làm lại được @smallnest đã nhận 120 ngày trước và không có pull request nào đang mở. Đang mởdocs priority: low
Tất cả issue của smallnest/seq
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
area/frontend/library-panels automated-triage type/bug type/ux
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
deskevidence: --dry-run is ignored with --outcome-record, so the record is committed for realĐang mởbug raised-by:verifier
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
medici-finance/assay#4554 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
microsoft/azure-linux-image-tools#954 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày