golang-set
Go语言中缺失的"泛型"集合。在Go内置集合之前...请使用这个。
嘘
- 你好,👋!你是否使用或对Andrew Kelley创建的Zig编程语言感兴趣?如果是的话,golang-set项目有了一个新的兄弟项目:ziglang-set!快来看看吧!
2023年3月5日更新
- 打包版本:
2.2.0
发布包括重构以最小化指针间接引用,更好的方法文档标准,以及一些构造函数便利方法,以提高添加项目Append
或从现有Map
创建新集合时的人体工程学。 - 支持
新泛型
语法 - Go
1.18.0
或更高版本 - 工作流在Go
1.20
上测试
从Python转过来,我最怀念的东西之一就是那个极其出色的集合类型。这是我尝试模仿Python中集合类型的主要特性。当然,你可以争辩说Go不需要集合,否则创作者就会将其添加到标准库中。对于那些人,我只想说请忽略这个仓库,继续前进;对于其他觉得这个有用的人,请帮助我通过提出建议或PR来使它变得更好。
安装
使用go get
安装此包。
go get github.com/deckarep/golang-set/v2
特性
- 新 基于泛型的实现(需要Go 1.18或更高版本)
- 两种实现共用一个通用接口
- 一个非线程安全的实现,侧重性能
- 一个线程安全的实现,适合并发使用
- 功能完整的集合实现,模仿Python的集合实现
- 全面的单元测试和基准测试套件
受信赖
这个包被许多公司和成千上万的开源包信赖。以下是一些使用这个包的示例用户。
- 使用这个包的知名项目/公司
- Ethereum
- Docker
- 1Password
- Hashicorp
星标历史
使用方法
下面的代码演示了Set集合如何更好地管理数据,实际上最小化了代码中的样板代码和不必要的循环。这个包现在完全支持泛型语法,所以你现在可以为任何可比较类型的对象实例化一个集合。
在Go中,什么被认为是可比较的?
布尔值
、整数
、字符串
、浮点数
或基本上的基本类型。指针
数组
结构体
,如果它们的所有字段也都是独立可比较的
使用这个库就像创建一个线程安全或非线程安全的集合并为集合的实例化提供一个可比较
类型一样简单。
// 语法示例,不能编译。
mySet := mapset.NewSet[T]() // 其中T是某个具体的可比较类型。
// 因此这段代码创建了一个int集合
mySet := mapset.NewSet[int]()
// 或者你可能想要一个字符串集合
mySet := mapset.NewSet[string]()
type myStruct struct {
name string
age uint8
}
// 或者是一个结构体集合
mySet := mapset.NewSet[myStruct]()
// 最后是一个可以容纳任何东西的集合,使用any或空接口关键字:interface{}。这实际上移除了类型安全。
mySet := mapset.NewSet[any]()
综合示例
package main
import (
"fmt"
mapset "github.com/deckarep/golang-set/v2"
)
func main() {
// 创建一个基于字符串的必修课程集合。
required := mapset.NewSet[string]()
required.Add("烹饪")
required.Add("英语")
required.Add("数学")
required.Add("生物")
// 创建一个基于字符串的科学课程集合。
sciences := mapset.NewSet[string]()
sciences.Add("生物")
sciences.Add("化学")
// 创建一个基于字符串的选修课程集合。
electives := mapset.NewSet[string]()
electives.Add("焊接")
electives.Add("音乐")
electives.Add("汽车")
// 创建一个基于字符串的额外编程课程集合。
bonus := mapset.NewSet[string]()
bonus.Add("Go语言入门")
bonus.Add("Python傻瓜教程")
}
创建一个包含所有唯一课程的集合。 集合会自动去重相同的数据。
all := required
.Union(sciences)
.Union(electives)
.Union(bonus)
fmt.Println(all)
输出:
Set{烹饪, 英语, 数学, 化学, 焊接, 生物, 音乐, 汽车, Go语言入门, Python傻瓜教程}
烹饪被认为是科学课程吗?
result := sciences.Contains("烹饪")
fmt.Println(result)
输出:
false
显示所有不是科学课程的课程,因为我不喜欢科学。
notScience := all.Difference(sciences)
fmt.Println(notScience)
Set{音乐, 汽车, Go语言入门, Python傻瓜教程, 烹饪, 英语, 数学, 焊接}
哪些科学课程也是必修课程?
reqScience := sciences.Intersect(required)
输出:
Set{生物}
你们提供多少额外课程?
fmt.Println(bonus.Cardinality())
输出:
2
感谢访问!
-deckarep