golangにおけるシングルトンパターンの実装方法
Golangでシングルトンパターンを実装するための方法は次のとおりです
- グローバル変数の使用:パッケージの初期化関数で作成・初期化を行うグローバル変数を定義し、シングルトンオブジェクトが必要な箇所では、このグローバル変数を直接使用します。
package singleton
type singleton struct {
// ...
}
var instance *singleton
func init() {
instance = &singleton{
// ...
}
}
func GetInstance() *singleton {
return instance
}
- sync.Onceを利用した遅延初期化:sync.Onceを用いて、オブジェクトを1つだけ作成し、関数でそのオブジェクトを取得します。
package singleton
import "sync"
type singleton struct {
// ...
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{
// ...
}
})
return instance
}
- hungry ハンガーパターンを sync.Mutex で実装: sync.Mutex を利用して、オブジェクトは 1 つのみ作成可能とし、そのオブジェクトを 1 つの関数で取得する。
package singleton
import "sync"
type singleton struct {
// ...
}
var instance *singleton
var mutex sync.Mutex
func GetInstance() *singleton {
mutex.Lock()
defer mutex.Unlock()
if instance == nil {
instance = &singleton{
// ...
}
}
return instance
}
これらの実装手法では、必ず1つのインスタンスオブジェクトが保証されており、オブジェクト使用時には統一されたアクセスエントリを提供します。