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

相关推荐
风中的微尘6 小时前
39.网络流入门
开发语言·网络·c++·算法
西红柿维生素7 小时前
JVM相关总结
java·jvm·算法
ChillJavaGuy9 小时前
常见限流算法详解与对比
java·算法·限流算法
散1129 小时前
01数据结构-01背包问题
数据结构
sali-tec9 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
消失的旧时光-19439 小时前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww10 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
你怎么知道我是队长10 小时前
C语言---循环结构
c语言·开发语言·算法
艾醒10 小时前
大模型面试题剖析:RAG中的文本分割策略
人工智能·算法
o0o_-_11 小时前
【go/gopls/mcp】官方gopls内置mcp server使用
开发语言·后端·golang