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

360影视 欧美动漫 2025-05-24 08:06 2

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

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

一、什么是集合?

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

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

二、使用 map[T]bool 模拟 Setset :=make(map[string]bool)// 添加元素set["apple"] =trueset["banana"] =true// 判断是否存在ifset["apple"] { fmt.Println("apple 存在")}// 删除元素delete(set,"banana")// 遍历集合foritem :=rangeset { 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)// 遍历fork :=rangeset { fmt.Println("元素:", k)}

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

四、封装一个简单的 Set 类型(示例)typeIntSetmap[int]struct{}// 添加元素func(s IntSet) Add(valint) { s[val] =struct{}{}}// 删除元素func(s IntSet) Remove(valint) {delete(s, val)}// 判断是否存在func(s IntSet) Contains(valint)bool{ _, ok := s[val]returnok}// 遍历集合func(s IntSet) Elements int{ elems :=make(int0len(s))fork :=ranges { elems =append(elems, k) }returnelems}使用:s := IntSet{}s.Add(10)s.Add(20)fmt.Println("Contains 10:", s.Contains(10))// truefmt.Println("所有元素:", s.Elements)

五、适合的应用场景

• 去重操作(如处理唯一用户名、ID 集合等)• 判断某元素是否已经出现过• 实现某些算法(如交集、并集、差集)• 限制重复请求、唯一标记等功能用法示例定义集合set := map[int]struct{}{}添加元素set[val] = struct{}{}判断元素是否存在_, ok := set[val]删除元素delete(set, val)遍历集合for k := range set {}

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

来源:新浪财经

相关推荐