// 判断是否存在(逗号 ok 惯用法) if _, ok := set["alice"]; ok { fmt.Println("存在") }
// 删除元素 delete(set, "alice")
// 遍历 for key := range set { fmt.Println(key) }
// 获取长度 fmt.Println(len(set))
// 清空 Set(重新初始化) set = make(map[string]struct{})
🔹 两种方式对比
对比项
map[string]bool
map[string]struct{}
每个 value 内存
1 字节
0 字节 ✅
添加元素
m["k"] = true
m["k"] = struct{}{}
判断存在
if m["k"]
if _, ok := m["k"]; ok
可读性
✅ 更直观
❌ struct{}{} 写起来略丑
适用场景
元素少,追求简洁
元素多,追求省内存 ✅
经验法则:小 Set 用 bool 更简洁,大 Set 用 struct{} 更省内存。实际项目中两种都很常见。
🔹 实用示例
✅ 去重
1 2 3 4 5 6 7 8 9 10 11 12
funcunique(strings []string) []string { seen := make(map[string]struct{}, len(strings)) result := make([]string, 0, len(strings)) for _, s := range strings { if _, ok := seen[s]; !ok { seen[s] = struct{}{} result = append(result, s) } } return result }
✅ 集合交集
1 2 3 4 5 6 7 8 9
funcintersection(a, b map[string]struct{})map[string]struct{} { result := make(map[string]struct{}) for k := range a { if _, ok := b[k]; ok { result[k] = struct{}{} } } return result }
✅ 集合并集
1 2 3 4 5 6 7 8 9 10
funcunion(a, b map[string]struct{})map[string]struct{} { result := make(map[string]struct{}) for k := range a { result[k] = struct{}{} } for k := range b { result[k] = struct{}{} } return result }
🔹 进阶技巧
🎯 预分配容量(提升性能)
1 2
// 如果知道大概元素数量,预分配容量可减少 map 扩容开销 set := make(map[string]struct{}, 1000)