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 语言可以轻松完成集合相关的所有操作,简洁高效,且便于扩展封装。

相关推荐
We་ct2 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮6 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说6 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove7 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung8 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了8 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL8 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰8 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商8 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法