Go语言模拟集合类型-《Go语言实战指南》

在 Go 语言中没有内建的 Set(集合) 类型,但我们可以通过 map 来模拟集合的功能,借助 map[T]boolmap[T]struct{} 实现高效的去重、添加、删除、判断元素是否存在等操作。

一、什么是集合?

集合(Set)是一种不包含重复元素的无序数据结构。典型操作包括:

  • • 添加元素(Add)
  • • 删除元素(Remove)
  • • 判断是否存在(Contains)
  • • 遍历集合(Iterate)

二、使用 map[T]bool 模拟 Set

复制代码
set := make(map[string]bool)

// 添加元素
set["apple"] = true
set["banana"] = true

// 判断是否存在
if set["apple"] {
    fmt.Println("apple 存在")
}

// 删除元素
delete(set, "banana")

// 遍历集合
for item := range set {
    fmt.Println("元素:", item)
}

这种方式直观易懂,true 表示存在,false 可表示"软删除"。


三、使用 map[T]struct{} 更节省内存

复制代码
set := make(map[int]struct{})

// 添加元素
set[1] = struct{}{}
set[2] = struct{}{}

// 判断是否存在
if _, ok := set[1]; ok {
    fmt.Println("1 在集合中")
}

// 删除元素
delete(set, 2)

// 遍历
for k := range set {
    fmt.Println("元素:", k)
}

⚠️ struct{} 是占用 0 字节内存的空结构体,适合只关心 key 的场景,更节省资源。


四、封装一个简单的 Set 类型(示例)

复制代码
type IntSet map[int]struct{}

// 添加元素
func (s IntSet) Add(val int) {
    s[val] = struct{}{}
}

// 删除元素
func (s IntSet) Remove(val int) {
    delete(s, val)
}

// 判断是否存在
func (s IntSet) Contains(val int) bool {
    _, ok := s[val]
    return ok
}

// 遍历集合
func (s IntSet) Elements() []int {
    elems := make([]int, 0, len(s))
    for k := range s {
        elems = append(elems, k)
    }
    return elems
}
使用:
复制代码
s := IntSet{}
s.Add(10)
s.Add(20)
fmt.Println("Contains 10:", s.Contains(10)) // true
fmt.Println("所有元素:", s.Elements())

五、适合的应用场景

  • • 去重操作(如处理唯一用户名、ID 集合等)
  • • 判断某元素是否已经出现过
  • • 实现某些算法(如交集、并集、差集)
  • • 限制重复请求、唯一标记等功能

六、小结

用法 示例
定义集合 set := map[int]struct{}{}
添加元素 set[val] = struct{}{}
判断元素是否存在 _, ok := set[val]
删除元素 delete(set, val)
遍历集合 for k := range set {}

通过使用 map 模拟 Set,Go 语言可以轻松完成集合相关的所有操作,简洁高效,且便于扩展封装。

相关推荐
smj2302_7968265217 小时前
解决leetcode第3768题.固定长度子数组中的最小逆序对数目
python·算法·leetcode
海上彼尚17 小时前
Go之路 - 6.go的指针
开发语言·后端·golang
cynicme17 小时前
力扣3531——统计被覆盖的建筑
算法·leetcode
core51218 小时前
深度解析DeepSeek-R1中GRPO强化学习算法
人工智能·算法·机器学习·deepseek·grpo
mit6.82418 小时前
计数if|
算法
a伊雪18 小时前
c++ 引用参数
c++·算法
Data_agent19 小时前
1688获得1688店铺列表API,python请求示例
开发语言·python·算法
2301_7644413320 小时前
使用python构建的应急物资代储博弈模型
开发语言·python·算法
小熳芋20 小时前
验证二叉搜索树- python-递归&上下界约束
数据结构
hetao173383720 小时前
2025-12-11 hetao1733837的刷题笔记
c++·笔记·算法