1. 单例模式

1. 单例模式 #

单例模式采用了 饿汉式 和 懒汉式 两种实现,饿汉式的实现,简单,并且可以将问题及早暴露,懒汉式虽然支持延迟加载,并没有本质上解决问题,并且为了实现懒汉式还不可避免的需要加锁。

1.1 饿汉式 #

package singleton

// Singleton 饿汉式单例
type Singleton struct {
	a string // 测试字段
}

var singleton *Singleton

func init() {
	singleton = &Singleton{a: "test"}
}

// GetInstance 获取实例
func GetInstance() *Singleton {
	return singleton
}

1.2 懒汉式 #

package singleton

import "sync"

var (
	lazySingleton *Singleton
	once          = &sync.Once{}
)

// GetLazyInstance 懒汉式
func GetLazyInstance() *Singleton {
	// once 内的方法只会执行一次,所以不需要再次判断
	once.Do(func() {
		lazySingleton = &Singleton{a: "test"}
	})

	return lazySingleton
}