シングルトン パターンは、特定のリソースへのアクセスを制御するために、システム内にインスタンスを 1 つだけ作成できるようにする一般的な設計パターンです。 Go 言語では、シングルトン パターンを実装する方法が数多くあります。この記事では、Go 言語でのシングルトン パターンの実装について詳しく説明します。
シングルトン パターンは、1 つのオブジェクトの作成のみを許可するデザイン パターンを指します。通常、データベース接続やスレッド プールなどの特定のリソースへのアクセスを制御するために使用されます。シングルトン モードを使用すると、システム内にインスタンスが 1 つだけ存在するようにし、他のオブジェクトが使用できるグローバル アクセス ポイントを提供できます。
#方法 1: 遅延スタイル
package singleton import "sync" var ( instance *Singleton once sync.Once ) type Singleton struct { } func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{} }) return instance }
上記のコードでは、Singletonという構造体を定義し、インスタンス化しています。同時に、同期パッケージで sync.Once オブジェクトを 1 回使用して、プログラムのライフ サイクル中に 1 回だけ実行されるロジックを実装します。 GetInstance が初めて呼び出されるとき、Sync.Once の Do メソッドは渡された関数を呼び出します。この関数のロジックは、Singleton オブジェクトをインスタンス化してインスタンスに割り当てることです。後続の GetInstance の呼び出しでは、インスタンスはすでにインスタンス化されているため、再度作成されることはありません。
方法 2: ハングリー チャイニーズ スタイルpackage singleton var instance *Singleton = &Singleton{} type Singleton struct { } func GetInstance() *Singleton { return instance }
上記のコードでは、パッケージの初期化中に Singleton オブジェクトを作成し、インスタンスとして割り当てました。 GetInstace メソッドはインスタンスを直接返すため、各呼び出しは同じオブジェクトを返し、オブジェクト インスタンスを制御するという目的を達成します。
方法 3: ダブルチェック ロックpackage singleton import "sync" var ( instance *Singleton mu sync.Mutex ) type Singleton struct { } func GetInstance() *Singleton { if instance == nil { mu.Lock() defer mu.Unlock() if instance == nil { instance = &Singleton{} } } return instance }
上記のコードでは、ミューテックス ロックを使用して同時実行制御を実装し、マルチスレッド環境で 1 つのスレッドだけが重要なリソースにアクセスできるようにします。同時に、二重チェック機構を使用して、ミューテックスロックの使用頻度を減らします。
例package main import ( "fmt" "sync" ) type Cache struct { store map[string]string mu sync.Mutex } var instance *Cache func GetCacheInstance() *Cache { if instance == nil { instance = &Cache{ store: make(map[string]string), } } return instance } func (c *Cache) Get(key string) (string, bool) { c.mu.Lock() defer c.mu.Unlock() val, ok := c.store[key] return val, ok } func (c *Cache) Set(key, val string) { c.mu.Lock() defer c.mu.Unlock() c.store[key] = val } func main() { cache := GetCacheInstance() cache.Set("name", "Tom") if val, ok := cache.Get("name"); ok { fmt.Println(val) } }
上記のコードでは、データ キャッシュを表す Cache 構造体を定義します。キャッシュには、キーと値のペアを格納するための Store メンバー変数が含まれており、アクセスを制御するために mutex mu を使用します。 GetCacheInstance 関数は、データ キャッシュを表す Cache インスタンスを返します。初めて呼び出すと、インスタンスは Cache オブジェクトにインスタンス化されます。この例の main 関数は、シングルトン Cache オブジェクトを使用してデータを保存および取得する方法を示しています。
概要推奨学習:
Golang チュートリアル以上がGo 言語のシングルトン パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。