golang 单例模式

284 阅读1分钟

最近在项目中使用websocket中,需要一个管理者,管理所有websocket连接,就是一个数组,存了很多map,map中有websocket连接信息,使用场景中,我们需要保证整个程序只用一个管理对象,那么单例模式就用到了

图片.png 其实,上述的代码就已经实现了单例模式 使用的便是全局变量的方式实现,那么我们来介绍一下go的单例模式吧

单例模式分为

1、懒汉(程序用到才初始化) 其实可以用加锁实现,但是会影响性能,这里就不讲了

2、原子类sync.Once的Do方法可以实现在程序运行过程中只运行一次其中的回调,这样就可以只创建了一个对象,背后运用cas,这里就不多说了,如果使用原子类初始化,websocket管理者初始化则需要如下

图片.png

2、饿汉(程序启动就生成了)

1、全局变量

全局变量的方式,就如图一,变量的初始化定义在方法外

2、init

则如下,init函数只会执行一下,全局变量顺序要先于init,然后也是赋值给全局变量,这里就不用项目代码演示了。其实中间件的初始化,都会定义一个全局变量,然后在函数中初始然后赋值给全局变量,这都是单例模式。

type singleton struct {

}

var instance *singleton

func init()  {
 instance = new(singleton)
}

func GetInstance()  *singleton{
 return instance
}