Using sync.Mutex
import (
"sync"
"sync/atomic"
)
type singleton struct {
}
var instance *singleton
var mu sync.Mutex
var initialized uint32
func GetSingleton() *singleton {
if atomic.LoadUint32(&initialized)>0 {
return instance
}
mu.Lock()
defer mu.Unlock()
instance=&singleton{}
atomic.StoreUint32(&initialized,1)
return instance
}
Using sync.Once
import "sync"
type singleton struct {
}
var instance *singleton
var once sync.Once
func GetSingleton() *singleton {
once.Do(func() {
instance=&singleton{}
});
return instance
}