Go中单例模式通过包级变量和函数实现,常见方式包括:1. 懒汉模式(非并发安全)在首次调用时创建实例,但多协程下存在竞态条件;2. 加锁实现通过sync.Mutex确保线程安全,但每次调用均加锁影响性能;3. 双重检查锁定推荐使用sync.Once,保证初始化函数仅执行一次,兼具安全与效率;4. 饿汉模式在包初始化时创建实例,天然并发安全,适用于初始化成本低的场景。最推荐sync.Once实现的懒加载,兼顾安全性与性能,饿汉模式适合简单场景,选择依据为是否需延迟初始化、性能要求及代码可读性。

在Go语言中,单例模式用于确保一个类型仅被实例化一次,并提供一个全局访问点。由于Go没有类的概念,通常使用包级变量和函数来实现单例。以下是几种常见的实现方式及其特点。
懒汉模式在第一次调用时才创建实例,适合资源初始化较重的场景。但未加锁时在多协程下可能创建多个实例。
示例代码:var instance *Singleton
type Singleton struct{}
func GetInstance() *Singleton {
if instance == nil {
instance = &Singleton{}
}
return instance
}
这种方式简单,但在高并发下存在竞态条件,不推荐在生产环境直接使用。
通过sync.Mutex保证只有一个协程能创建实例,解决并发问题。
立即学习“go语言免费学习笔记(深入)”;
var (
instance *Singleton
mu sync.Mutex
)
func GetInstance() *Singleton {
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &Singleton{}
}
return instance
}
虽然线程安全,但每次调用都加锁,影响性能。
在加锁前后都检查实例是否已创建,减少锁竞争。
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
if instance == nil {
once.Do(func() {
instance = &Singleton{}
})
}
return instance
}
sync.Once,无需手动判空。
更正如下:
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
利用sync.Once保证函数仅执行一次,既安全又高效,是推荐做法。
利用Go的init函数或包变量在程序启动时完成初始化。
var instance = &Singleton{}
type Singleton struct{}
func GetInstance() *Singleton {
return instance
}
实例在包加载时就创建,天然并发安全,适用于初始化成本不高且必定使用的场景。
基本上就这些常见方式。最推荐的是sync.Once实现的懒加载,兼顾安全与性能。饿汉模式适合简单直接的场景。选择哪种方式取决于具体需求:是否需要延迟初始化、对性能的要求、代码可读性等。
以上就是Golang如何实现单例模式_Golang Singleton模式实现方法总结的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号