ホームページ  >  記事  >  バックエンド開発  >  Go 言語のシングルトン パターンの詳細な分析

Go 言語のシングルトン パターンの詳細な分析

青灯夜游
青灯夜游オリジナル
2023-03-21 18:36:452588ブラウズ

シングルトン パターンは、特定のリソースへのアクセスを制御するために、システム内にインスタンスを 1 つだけ作成できるようにする一般的な設計パターンです。 Go 言語では、シングルトン パターンを実装する方法が数多くあります。この記事では、Go 言語でのシングルトン パターンの実装について詳しく説明します。

Go 言語のシングルトン パターンの詳細な分析

シングルトン パターンとは

シングルトン パターンは、1 つのオブジェクトの作成のみを許可するデザイン パターンを指します。通常、データベース接続やスレッド プールなどの特定のリソースへのアクセスを制御するために使用されます。シングルトン モードを使用すると、システム内にインスタンスが 1 つだけ存在するようにし、他のオブジェクトが使用できるグローバル アクセス ポイントを提供できます。

#Go でシングルトン モードを実装する方法

Go 言語には、次のメソッドを含む、シングルトン モードを実装するさまざまな方法が用意されています。

#方法 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: ハングリー チャイニーズ スタイル

ハングリー チャイニーズ スタイルは、シングルトン パターンを実装するもう 1 つの一般的な方法であり、システムの起動時にシングルトンを作成することを特徴としています。 、呼び出されたときにインスタンスが直接返されます。実装方法は次のとおりです。

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 オブジェクトを使用してデータを保存および取得する方法を示しています。

概要

シングルトン パターンは、システム内にインスタンスが 1 つだけ存在することを保証し、グローバル アクセス ポイントを提供する一般的な設計パターンです。 Go 言語では、遅延スタイル、ハングリー スタイル、ダブルチェック ロックなど、シングルトン パターンを実装するさまざまな方法があります。この記事では、これらの実装方法の具体的な詳細を理解し、データ キャッシュの例を実装します。

推奨学習:

Golang チュートリアル

以上がGo 言語のシングルトン パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。