Go语言技巧:利用空结构体实现高效集合

简介: Go语言技巧:利用空结构体实现高效集合

Go语言技巧:利用空结构体实现高效集合

在Go开发中,集合(Set)是常用的数据结构,但Go标准库并未直接提供。本文将介绍一个优雅的技巧——利用空结构体struct{}来实现高性能集合。

为什么选择空结构体?

空结构体在Go中占据零字节内存。当我们用map[string]struct{}表示集合时,每个键只占用键本身的内存,值不占用额外空间。相比之下,map[string]bool每个键还要额外存储一个布尔值。

基础实现

type Set map[string]struct{
   }

func NewSet(items ...string) Set {
   
    s := make(Set)
    for _, item := range items {
   
        s.Add(item)
    }
    return s
}

func (s Set) Add(item string) {
   
    s[item] = struct{
   }{
   }
}

func (s Set) Contains(item string) bool {
   
    _, ok := s[item]
    return ok
}

func (s Set) Remove(item string) {
   
    delete(s, item)
}

并发安全版本

若需并发使用,可结合sync.RWMutex

type SafeSet struct {
   
    m map[string]struct{
   }
    mu sync.RWMutex
}

性能对比

基准测试显示,map[string]struct{}相比map[string]bool在内存分配上减少约33%,GC压力也明显降低。

扩展技巧

泛型版本(Go 1.18+):

type Set[T comparable] map[T]struct{
   }

这个轻量级实现既保持了代码简洁,又获得了最佳性能,是Go语言中“少即是多”哲学的典型体现。

目录
相关文章
|
存储 NoSQL Redis
redis set底层数据结构
set底层存储  redis的集合对象set的底层存储结构特别神奇,我估计一般人想象不到,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。
7365 0
|
9月前
|
Prometheus Kubernetes 监控
Kubernetes(k8s)高可用性集群的构建详细步骤
构建高可用Kubernetes集群涉及到的层面非常广泛,包括硬件资源的配置、网络配置以及集群维护策略的规划。因此,在实际操作中,可能还需要根据特定环境和业务需求进行调整和优化。
2388 19
|
8月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
架构师 NoSQL 大数据
复习七天通过软考高级系统架构师经历
复习七天通过软考高级系统架构师经历
623 1
|
敏捷开发 监控 数据可视化
软件工程基础知识,软考选择题的重点
本文总结了软件工程的基础知识要点,包括软件生命周期、过程成熟度级别、开发模型、开发方法、软件测试、项目管理(成本估算、进度管理、风险管理)以及软件质量特性,旨在为软考选择题提供复习重点。
411 2
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
648 4
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
573 2
|
JSON 数据格式
关于nlohmann::json的简单使用
关于nlohmann::json的简单使用
763 0
关于nlohmann::json的简单使用
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::begin() 的用法
C++ JSON库 nlohmann::basic_json::begin() 的用法
290 0
|
Go
Go命令行解析神器入门 - 10分钟上手flag包
Go命令行解析神器入门 - 10分钟上手flag包
572 0

热门文章

最新文章