保证一个类仅有一个实例,并提供一个访问它的全局访问点。

懒汉式

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

  1. type Singleton struct {
  2. }
  3. var singleton *Singleton
  4. func GetInstance() *Singleton {
  5. // 如果为空,则创建单例
  6. if singleton == nil {
  7. singleton = &Singleton{}
  8. }
  9. return singleton
  10. }

线程安全

  1. var (
  2. once sync.Once
  3. instance *Singleton
  4. )
  5. type Singleton struct {
  6. }
  7. func GetInstance() *Singleton {
  8. if instance == nil {
  9. once.Do(func() {
  10. instance = &Singleton{}
  11. })
  12. }
  13. return instance
  14. }