Golang 单例模式

单例模式是一种最基本的设计模式,属于创造模式的一种。在应用了单例模式的时候,类的实例在全局中只会存在一个。实例也只会被创建一次。通常用于系统只需要拥有一个全局对象的时候。例如数据库连接对象。

单例模式分为懒汉和饿汉模式两种。

首先是饿汉模式:

1
2
3
4
5
6
7
type object struct{}

var instance *object = &object{}

func GetObject() *object {
return instance
}

在包初始化的过程中就完成了对象的初始化工作,然后调用函数直接返回实例对象即可。

但是由于是在导入包的过程中初始化对象,会造成加载时间过长。

然后就是懒汉模式,懒汉模式是在实际调用时才会去创建对象的实例。

1
2
3
4
5
6
7
8
9
10
11

type object struct {}

var instance *object

func GetObject() *object {
if instance == nil {
instance = &object{}
}
return instance
}

在判断实例变量为nil时,才会去创建对象。但是直接这样写会带来并发上的问题。如果多个 goroutine 调用方法,会创建出多个实例来。因此为了保障并发安全,可以对其中的逻辑进行加锁的操作。

但是在 Go 中还有另外的一种方式,那就是借助 once.Do 来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
type object struct {}

var (
instance *object
once sync.Once
)

func GetObject() *object {
once.Do(func() {
instance = &object{}
})
return instance
}

使用 Once.Do,既保证了对象会被初始化一次,也保证了并发下只创建一个对象。

因此,如果需要在 Go 中应用单例模式,那么最好的选择就是使用 Once.Do 方法。


Golang 单例模式
https://blog.zhangliangliang.cc/post/golang-singleton-parttern.html
作者
Bobby Zhang
发布于
2021年12月26日
许可协议