golang,go,博客,开源,编程

golang每日一库之deckarep/golang-set

Updated on with 0 views and 0 comments

github.com/deckarep/Golang-set 介绍

github.com/deckarep/Golang-set 是 Go 语言中一个流行的 集合(Set) 库,它提供了强类型、安全且易于使用的集合数据结构。Go 语言标准库没有内置集合(Set)类型,而该库弥补了这一缺陷,并提供了基本的集合操作,如 添加、删除、交集、并集、差集 等。


1. 安装

可以使用 go get 安装:

go get github.com/deckarep/golang-set/v2

然后在 Go 代码中导入:

import mapset "github.com/deckarep/golang-set/v2"

2. 主要特性

  • 泛型支持(V2 版本),兼容 Go 1.18+
  • 线程安全(ConcurrentSet) 和 非线程安全(Set)两种实现
  • 提供集合的标准操作,如:
    • 并集(Union)
    • 交集(Intersect)
    • 差集(Difference)
    • 子集检查(Subset)
    • 超集检查(Superset)

3. 基本用法

3.1 创建集合

package main

import (
	"fmt"

	mapset "github.com/deckarep/golang-set/v2"
)

func main() {
	// 创建一个新的集合
	set := mapset.NewSet[int]()

	// 添加元素
	set.Add(1)
	set.Add(2)
	set.Add(3)

	// 打印集合
	fmt.Println(set) // 输出: Set{1, 2, 3}

	// 判断是否包含某个元素
	fmt.Println(set.Contains(2)) // 输出: true
	fmt.Println(set.Contains(5)) // 输出: false
}

3.2 线程安全的集合

如果需要在并发环境下使用,可以使用 线程安全的 Set

safeSet := mapset.NewThreadSafeSet[int]()
safeSet.Add(100)
fmt.Println(safeSet.Contains(100)) // 输出: true

3.3 并集(Union)

setA := mapset.NewSet[int](1, 2, 3)
setB := mapset.NewSet[int](3, 4, 5)

unionSet := setA.Union(setB)
fmt.Println(unionSet) // 输出: Set{1, 2, 3, 4, 5}

3.4 交集(Intersect)

setA := mapset.NewSet[int](1, 2, 3)
setB := mapset.NewSet[int](3, 4, 5)

intersectSet := setA.Intersect(setB)
fmt.Println(intersectSet) // 输出: Set{3}

3.5 差集(Difference)

setA := mapset.NewSet[int](1, 2, 3, 4)
setB := mapset.NewSet[int](3, 4, 5)

diffSet := setA.Difference(setB)
fmt.Println(diffSet) // 输出: Set{1, 2}

3.6 子集(Subset)和 超集(Superset)

setA := mapset.NewSet[int](1, 2)
setB := mapset.NewSet[int](1, 2, 3, 4)

fmt.Println(setA.IsSubset(setB))  // 输出: true
fmt.Println(setB.IsSuperset(setA)) // 输出: true

3.7 遍历集合

set := mapset.NewSet[string]("apple", "banana", "cherry")

set.Each(func(item string) bool {
	fmt.Println(item)
	return false // return true 立即终止遍历
})

3.8 转换为 Slice

set := mapset.NewSet[int](1, 2, 3, 4)
slice := set.ToSlice()
fmt.Println(slice) // 输出: [1 2 3 4](顺序可能不同)

4. 适用场景

  1. 去重:快速去除重复数据。
  2. 集合运算:如交集、并集、差集。
  3. 权限管理:存储用户权限,快速查询是否有权限。
  4. 标签系统:如文章标签匹配。

5. 版本说明

  • V2 版本(推荐)
    • 引入了 泛型(Go 1.18+)
    • 命名空间改为 mapset "github.com/deckarep/golang-set/v2"
  • V1 版本(老版本)
    • 不支持泛型,使用 interface{} 存储数据
    • 导入路径为 github.com/deckarep/golang-set

6. 总结

  • Golang-set 提供了 集合(Set)数据结构,支持基本的集合操作。
  • V2 版本支持 泛型,更安全、易用。
  • 适用于 去重、权限管理、集合运算 等场景。

标题:golang每日一库之deckarep/golang-set
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/08/1741444892187.html
联系:scotttu@163.com