「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go デザイン パターン #Singleton

Go デザイン パターン #Singleton

2024 年 11 月 8 日に公開
ブラウズ:864

Go Design Patterns #Singleton

設計パターンは、ソフトウェア設計で発生する一般的な問題に対する実証済みの解決策です。これらの問題を柔軟かつ再利用可能な方法で解決するためのテンプレートまたはガイドが提供されます。

各パターンは、開発者が特定のコンテキストに適応できるベスト プラクティスを表しています。デザイン パターンは、多くの場合、3 つの主要なカテゴリに分類されます。

このシリーズのスタートとして、シングルトン パターンについて話しましょう。

シングルトン

シングルトン パターンは、クラスにインスタンスが 1 つだけあることを保証し、そのインスタンスへのグローバル アクセス ポイントを提供します。

これは、データベース接続や構成設定などの共有リソースを管理する必要がある場合に便利です。

問題提起

構成を管理するときやハードウェア リソースと対話するときなど、クラスのインスタンスが 1 つだけ存在することを確認する必要があることがよくあります。シングルトンを使用しないと、複数のインスタンスを作成すると、データの不整合やリソースのロックなどの問題が発生する可能性があります。

これは、複数のゴルーチンがクラスの新しいインスタンスを作成したり、共有リソースにアクセスしたりできる非同期コードを操作するときによく発生します。

現実世界の例

データベース接続プールを検討します。アプリケーションの複数の部分が同時に新しい接続を作成すると、データベースの相互作用が冗長になったり、競合したりする可能性があります。シングルトンは、アプリケーション全体で 1 つの接続のみが作成され使用されることを保証します。

実装

package main

import (
    "fmt"
    "sync"
)

type Singleton interface {
    DoSomething() string
}

type singleton struct{}

var lock = &sync.Mutex{}

var instance *singleton

func NewSingletonInstance() *singleton {
    if instance == nil {
        lock.Lock()
        defer lock.Unlock()
        if instance == nil {
            fmt.Println("Creating single instance now.")
            instance = &singleton{}
        } else {
            fmt.Println("Single instance already created.")
        }
    } else {
        fmt.Println("Single instance already created.")
    }

    return instance
}

func (s *singleton) DoSomething() string {
    return "Doing something."
}

func main() {
    instance1 := NewSingletonInstance()
    instance2 := NewSingletonInstance()
    fmt.Printf("%p\n", instance1)
    fmt.Printf("%p\n", instance2)
}

関数 NewSingletonInstance は、複数回呼び出された場合でも、シングルトンのインスタンスが 1 つだけ作成されるようにします。

  • まず、インスタンスが nil (つまり、インスタンスがまだ作成されていない) かどうかを確認します。
  • インスタンスが nil の場合、lock.Lock() を使用してコードのセクションをロックし、複数のゴルーチンがこのセクションに同時に入るのを防ぎます。
  • ロック後、2 回目のチェックが実行され、最初のチェックからロックが取得されるまでの間に他のゴルーチンがインスタンスを作成していないことが確認されます。
  • インスタンスがまだ nil の場合、新しいシングルトン インスタンスが作成され、グローバル変数に割り当てられます。
  • sync.Mutex と二重チェックされたロックにより、シングルトン インスタンスの作成がスレッドセーフであることが保証され、複数の goroutine が個別のインスタンスを作成するのを防ぎます。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/eduardoarndt/go-design-patterns-1-singleton-4ap9?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3