Go

How singleton pattern works with Golang | by Jefferson Otoni Lima | Golang Issue | Medium Go 言語における Singleton Pattern | text.Baldanders.info

よくやるやつ

なにも考えずにつくるとこうなる

var instance *Config
 
func GetInstance() *Config {
    if instance == nil {
        instance = &Config{}
    }
    return instance
}

これはスレッドセーフではないので、instanceの生成処理に時間がかかる場合にgoroutineなどで同時にアクセスすると、 複数回生成実行される

Singletonでない

解決策

sync.Oncesync.Mutex を使うといい

var instance *Config
var once sync.Once
 
func GetInstance() *Config {
	once.Do(func() {
		instance = NewConfig()
	})
	return instance
}