最近在项目中使用websocket中,需要一个管理者,管理所有websocket连接,就是一个数组,存了很多map,map中有websocket连接信息,使用场景中,我们需要保证整个程序只用一个管理对象,那么单例模式就用到了
其实,上述的代码就已经实现了单例模式
使用的便是全局变量的方式实现,那么我们来介绍一下go的单例模式吧
单例模式分为
1、懒汉(程序用到才初始化) 其实可以用加锁实现,但是会影响性能,这里就不讲了
2、原子类sync.Once的Do方法可以实现在程序运行过程中只运行一次其中的回调,这样就可以只创建了一个对象,背后运用cas,这里就不多说了,如果使用原子类初始化,websocket管理者初始化则需要如下
2、饿汉(程序启动就生成了)
1、全局变量
全局变量的方式,就如图一,变量的初始化定义在方法外
2、init
则如下,init函数只会执行一下,全局变量顺序要先于init,然后也是赋值给全局变量,这里就不用项目代码演示了。其实中间件的初始化,都会定义一个全局变量,然后在函数中初始然后赋值给全局变量,这都是单例模式。
type singleton struct {
}
var instance *singleton
func init() {
instance = new(singleton)
}
func GetInstance() *singleton{
return instance
}