Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

记录:短函数字面量提案 #21498 落地后可大幅简化本库调用点样板

未关闭
#46 0 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

@smallnest 已经在做这个了。

开始于 2026年6月28日。

评估

这个 Issue 还没有评估数据。

描述

docs priority: low

背景

本库是回调密集型:几乎所有中间/终结操作(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 本身无需改动(纯调用点收益)。
  • 若 #21498 被拒绝,则本库调用风格定型为显式 func 字面量,本 issue 关闭

Type

docs / tracking · 优先级 low · 关联上游 golang/go#21498

相关

主要语言
Go
星标
69
派生
1
PR 合并指标
30 天内没有已合并 PR

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

smallnest/seq 的其他 Issue

查看 smallnest/seq 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。