单例模式是一种常见的设计模式,它保证一个类只有一个实例,并提供一个全局访问点以访问该实例。
Go 语言实现单例模式提供一般有以下几种方法:
方法一: 懒汉式
懒汉式,顾名思义,只有在用的时候才会去创建实例。实现方法如下:
package singleton
import "sync"
var (
instance *Singleton
once sync.Once
)
type Singleton struct {
}
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
在上述代码中,使用 sync 包中的 sync.Once 中的Do方法实现在程序生命周期内只执行一次的逻辑。
方法二:饿汉式
懒汉式,顾名思义,在一开始的时候就会去创建实例。实现方法如下:
package singleton
var instance *Singleton = &Singleton{}
type Singleton struct {
}
func GetInstance() *Singleton {
return instance
}
在上面的代码中,我们在刚开始就创建了一个 Singleton 对象并赋值为 instance。GetInstace 方法直接返回instance实例,每一次调用都返回同一个对象。
方法三:双重检查锁定
双重检查锁定是一种在多线程环境下使用的单例模式实现方式,其特点是先检查是否已经有实例,如果没有则进行创建。实现方法如下:
package singleton
import "sync"
var (
instance *Singleton
mu sync.Mutex
)
type Singleton struct {
}
func GetInstance() *Singleton {
if instance == nil {
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &Singleton{}
}
}
return instance
}