返回

文章详情

Golang 提案:容器/: 通用集合类型

Hacker News2026年7月31日 18:39

背景:Go 集合工作组于 2025 年底成立,旨在根据熟悉的 Go 原则(务实与简单)将常见集合数据结构引入标准库。按姓氏字母顺序,成员包括 Jonathan Amsterdam(@jba),Alan Donovan(@adonovan),Robert Griesemer(@griesemer),Daniel Martí(@mvdan),Roger Peppe(@rogpeppe),Keith Randall(@khr)和 Ian Lance Taylor(@ianlancetaylor)。我们现在已经达到可以与社区分享我们的成果的阶段。这个问题是讨论多个与 Go 1.28 新集合 API 相关的提案的总揽。它提供了主题的高级概述,并链接到各种具体提案及其相关实现 CL。Go 当前在其库中提供的集合类型很少,从一开始我们就强调语言内置切片和映射类型的灵活性。在这些提供中,最重要的是堆,用于优先级队列。甚至集合也是缺失的;它们通常以 map[T]bool 或 map[T]struct{} 表示。基于二叉树的有序映射和集合完全缺失。自从在 Go 1.18 中添加了泛型,以及在 Go 1.23 中添加了迭代器之后,库定义的类型可以实现与内置类型相当的使用方便性,且许多对切片和映射的常见操作可通过调用库函数来表达。这项工作旨在将一些更重要的数据类型添加到标准库中,并为其 API 及未来的添加建立约定。提案:拟议的添加包括:#70471,CL 657296(在 go1.27 中发布):hash/maphash.Hasher:用于表达自定义哈希函数和任意数据类型的相等关系的标准接口。这些可能与 map[K]V 使用的编译器定义的对象不同,并且在键类型不可比较(例如切片或映射)或默认比较产生错误结果(例如 types.Type 值,需要深度比较操作 types.Identical)时非常有用。其包文档包括其在布隆过滤器中的使用示例。#69559,CL 612217:container/hash.Map[K,V]:使用上述自定义哈希函数的基于哈希的映射。#80584,CL 741160:container/hash.Set[T]:沿同样线路的基于哈希的集合。#69230,CL 745441:container/set.Set[T]:具有可比较元素的集合的规范数据类型。它透明地表示为 map[T]struct{},并支持所有常见的集合操作,例如联集和交集。它比基于 map[T]bool 和 map[T]struct{} 的“传统”集合更方便,避免了对 map[T]bool 中潜在假值的歧义。我们预计它将成为大多数新 Go API 中的标准集合。#77052,CL 724420:container/mapset:用于方便操纵遗留集合作为现有代码中无法更改 API 的集合的帮助函数包(联集、交集等)。这些函数与 set.Set 的方法完全平行。#60630:container/ordered.Map[K,V]:有序映射。当前实现使用平衡二叉树,但设计中没有任何要求。构建 map[K]V 然后对其键进行排序的常见 Go 模式在大多数情况下效果很好,但在某些情况下,例如需要范围查询时,其他数据结构效果更好。#77397:container/heap/v2.Heap:通用二叉堆 API,以替代标准库中现有的堆,使其使用起来更加简单。我们预计将在适当的时候考虑额外的提案,例如插入顺序的哈希映射(#80194)和栈。所有提出的数据结构的初始实现旨在尽可能简单地满足 API 和渐进性能预期。尽管后续有很多机会进行优化以减少常数因素,但它们超出了提案过程的范围。尽管新包将位于现有容器树中,我们更喜欢使用“集合”一词,以避免与 Linux 的容器虚拟化概念混淆。抽象集合约束接口 新的 Map 和 Set 类型的大多数方法并不特定于任何具体的表示类型,而是所有 Maps 和 Sets 之间的共通部分。然而,由于“二元方法问题”,它们并不是真正实现了一个通用接口类型:如果每个集合数据类型 S 都有形如 func (S) Union(S) S 的联合方法,则不同集合类型的联合方法是不兼容的,因此它们没有共同的普通接口。为了表达这个抽象的 Set 类型,我们必须使用 F 界限多态性,或递归约束接口。CL 761460 向容器包添加了未导出的抽象 Collection、Set 和 Map 约束接口类型,允许包实现者编写抽象帮助函数(如 ContainsAny、Subset 或 Arbitrary),这些函数可用于处理集合。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡