golang单例模式

单例模式(singleton)是设计模式的一种,其定义是:

Ensure a class has one instance, and provide a global point of access to it.也就是:保证类只有一个实例,而且有一个全局访问点。

go支持部分的 oo 编程,但不支持不支持构造/析构函数,也不支持 static 参数,所以 oo 中常用的单例模式的实现 go 中是不行的。然而 go 有自己的方式:

  1. package singleton
  2.  
  3. import "sync"
  4.  
  5. type singleton struct {
  6.         value interface{}
  7. }
  8.  
  9. var instance *singleton
  10. var once sync.Once
  11.  
  12. func New() *singleton {
  13.         once.Do(func() {
  14.                 instance = &singleton{}
  15.         })
  16.         return instance
  17. }

实现思路:

  1. 将单例的类型放在 package 一级,名称小写来实现对外隐藏;
  2. 提供一个全局的入口 New() 方法,返回指向唯一实例的指针;(如果返回类型实例则不能保证唯一性,因为 go 中结构体是值类型,赋值是 value 拷贝);
  3. 通过 sync.Once 来保证实例的唯一性,因为 once.Do 中的方法参数只会调用一次;

Tags: 

Article type: