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

相关推荐
小智老师PMP21 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
花酒锄作田22 分钟前
Go - Gin中使用sessions
golang
HugoStudio_SWAN26 分钟前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183138 分钟前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate2 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran2 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹2 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年3 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨3 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法