编程 Go 1.28 计划引入的泛型集合:set.Set、hash.Map、tree.Map 分别补上哪种能力,抽象接口为何暂不导出

2026-10-27 21:01:38

Go 1.28 计划引入的泛型集合:set.Set、hash.Map、tree.Map 分别补上哪种能力,抽象接口为何暂不导出

Go Collections 工作组(Jonathan Amsterdam、Alan Donovan、Robert Griesemer 等 7 位核心贡献者)在 Issue #80590 提出了一个伞形提案,计划在 Go 1.28 标准库中加入哈希 Set/Map、树形有序 Map、新版堆,以及一套用来处理“二元方法问题”的抽象集合接口。所有内容仍是提案,API 可能调整。

各提案的作用

二元方法问题,与不导出的抽象接口

如果具体 Set 类型 S 有 Union(S) S,那么不同 Set 类型的方法互不兼容,无法用普通接口统一。工作组用 F-bounded 多态(递归约束接口)在 CL 761460 中加入了三个非导出接口:

_AbstractCollection[E any, C _AbstractCollection[E, C]]
_AbstractSet[E any, C _AbstractSet[E, C]]
_AbstractMap[K, V any, C _AbstractMap[K, V, C]]

它们包含 Clear/Clone/Contains/ContainsAll/Len/String 等。目前有意不导出,只用来在文档层面统一 API 惯例;使用者需要时,可以自定义最小约束接口。

纯函数式与 -With 后缀

提案严格区分纯函数式的集合代数运算与原置修改:原地版本统一加 -With 后缀(如 UnionWith)。这样,表达式写法保留易用性,同时把内存分配的选择权交回调用方;纯函数式版本需要返回新集合,原地版本则复用接收者。

从 map[T]struct{} 迁移

已有代码不必一步切换。container/mapset 以 map[T]bool 为输入,提供与 set.Set 一一对应的方法,先把散落在业务里的并集、交集手写循环换成函数调用;等 set.Set 稳定后,再把 map[T]bool 换成 set.Set[T],调用点基本不用改。这也顺带解决了用 bool 值表示成员、导致语义混淆的问题。

后续还会讨论插入序 Map 与 Stack。是否进入 Go 1.28,取决于最终审议。

复制全文 生成海报 Go 标准库 泛型

推荐文章

程序员茄子在线接单