」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 設計模式#Singleton

Go 設計模式#Singleton

發佈於2024-11-08
瀏覽:109

Go Design Patterns #Singleton

設計模式是針對軟體設計中出現的常見問題的經過嘗試和測試的解決方案。它們提供了以靈活且可重複使用的方式解決這些問題的範本或指南。

每種模式都代表了開發人員可以適應其特定環境的最佳實踐。設計模式通常分為三大類。

為了開始這個系列,我們先來談談單例模式。

辛格頓

單例模式確保一個類別只有一個實例,並提供對該實例的全域存取點。

這在您需要管理共享資源(例如資料庫連線或組態設定)的情況下非常有用。

問題陳述

通常需要確保某個類別僅存在一個實例,例如在管理配置或與硬體資源互動時。如果沒有 Singleton,建立多個實例可能會導致資料不一致或資源鎖定等問題。

這種情況在使用非同步程式碼時很常見,其中多個 goroutine 可以建立類別的新實例或存取共享資源。

現實世界的例子

考慮資料庫連接池:如果應用程式的多個部分同時建立新連接,則最終可能會出現冗餘或衝突的資料庫互動。單例確保在整個應用程式中僅建立和使用一個連線。

執行

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 確保僅建立一個單例實例,即使多次呼叫也是如此。

  • 首先,它檢查實例是否為零(即尚未建立實例)。
  • 如果instance為nil,它會使用lock.Lock()鎖定該部分程式碼,以防止多個goroutine同時進入該部分。
  • 鎖定後,執行第二次檢查,以確保在第一次檢查和獲取鎖之間沒有其他 goroutine 建立該實例。
  • 如果實例仍然為零,則建立新的單例實例並將其指派給全域變數。
  • sync.Mutex 和雙重檢查鎖定確保單例實例的創建是線程安全的,防止多個 goroutine 創建單獨的實例。
版本聲明 本文轉載於:https://dev.to/eduardoarndt/go-design-patterns-1-singleton-4ap9?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 PHP 中透過 SSH 安全連接到遠端 MySQL 伺服器?
    如何在 PHP 中透過 SSH 安全連接到遠端 MySQL 伺服器?
    在PHP 中透過SSH 安全連接到遠端MySQL 伺服器要為PHP 資料庫連線建立安全隧道,以下SSH 隧道解決方案提供了一種強大的方法。 SSH 隧道設定建立通往 MySQL 資料庫伺服器的 SSH 隧道。為此,請使用以下命令:ssh -fNg -L 3307:10.3.1.55:3306 [em...
    程式設計 發佈於2024-11-08
  • 混淆技術真的可以保護可執行檔免受逆向工程的影響嗎?
    混淆技術真的可以保護可執行檔免受逆向工程的影響嗎?
    保護可執行檔免於逆向工程:解決方案有限的挑戰保護程式碼免於未經授權的逆向工程是開發人員持續關注的問題,尤其是當它包含敏感資訊時。雖然已經提出了各種方法,但重要的是要承認完全防止逆向工程實際上是不可能的。 常見混淆技術使用者建議的策略,例如程式碼注入、混淆和自訂啟動例程的目的是使反彙編變得不那麼簡單。...
    程式設計 發佈於2024-11-08
  • 掌握 Laravel 中的 Eloquent where 條件
    掌握 Laravel 中的 Eloquent where 條件
    Laravel 的 Eloquent ORM(物件關係映射)是其突出的功能之一,提供了與資料庫互動的強大而富有表現力的方式。 Eloquent 提供的一項基本功能是方法,它允許開發人員高效、直觀地過濾查詢。在本文中,我們將深入研究 where 條件,探索其各種形式和實際用例。 w...
    程式設計 發佈於2024-11-08
  • 在 Gmail 的 Chrome 12+ 更新中如何從剪貼簿貼上圖片?
    在 Gmail 的 Chrome 12+ 更新中如何從剪貼簿貼上圖片?
    將剪貼簿中的圖像貼到Gmail:Chrome 12 中的操作方法Google 宣布能夠將剪貼簿中的圖像直接貼到Gmail使用Chrome 12 的Gmail 引發了人們對其底層機制的好奇。儘管使用了最新的 Chrome 版本,但一些用戶仍然無法找到有關如何在 Webkit 中實現此增強功能的資訊。 ...
    程式設計 發佈於2024-11-08
  • JavaScript 示範場景競賽 - JS 版
    JavaScript 示範場景競賽 - JS 版
    JS1024 於 2024 年回歸! 準備好迎接令人興奮的挑戰! JS1024 回歸,透過在 JavaScript、HTML 或 GLSL 中創建令人驚嘆的演示(全部在 1024 位元組限制內),將開發人員推向極限。無論您是經驗豐富的編碼員還是新手,這都是您展示創造力和技術技能的機...
    程式設計 發佈於2024-11-08
  • 第九屆 TCmeeting 的更新
    第九屆 TCmeeting 的更新
    議程上有幾個項目,本文重點介紹第 104 次 TC39 會議 [2024 年 10 月 8 日至 10 日] 的功能提案及其進展。 第一階段: 表示度量:建議在 JavaScript 中使用適當的單位格式化和表示度量。 Immutable ArrayBuffers:新增 Arra...
    程式設計 發佈於2024-11-08
  • 如何使用 CSS 在圖像地圖上實現滑鼠懸停效果?
    如何使用 CSS 在圖像地圖上實現滑鼠懸停效果?
    使用 CSS 設定圖片地圖滑鼠懸停樣式使用 CSS 設定圖片地圖滑鼠懸停樣式建立互動網頁時,通常需要包含具有可點擊區域的圖像。通常,這是使用圖像映射來實現的。然而,事實證明,在滑鼠懸停時設置這些區域的樣式以提供額外的互動性是難以實現的。 <img src="{main_photo}&...
    程式設計 發佈於2024-11-08
  • 升級您的前端遊戲:無頭與靜態未來的學習框架
    升級您的前端遊戲:無頭與靜態未來的學習框架
    前端領域正以驚人的速度發展。忘掉笨重、單一的網站吧-未來屬於無頭 CMS 和靜態網站產生器 (SSG)。這些時尚的強大功能提供了無與倫比的速度、靈活性和安全性,但征服它們需要使用正確的工具。 為了利用他們的力量,開發人員正在轉向 Next.js 和 Gatsby,這兩個尖端的前端框架塑造了我們如何...
    程式設計 發佈於2024-11-08
  • 如何修復 PyGame 動畫閃爍:故障排除和解決方案
    如何修復 PyGame 動畫閃爍:故障排除和解決方案
    PyGame 動畫閃爍:故障排除和解決方案在執行 PyGame 程式時,您可能會遇到動畫閃爍的問題。這可能會令人沮喪,特別是如果您不熟悉使用該框架。 PyGame 中動畫閃爍的根本原因通常是多次呼叫 pygame.display.update()。不應在應用程式循環中的多個點更新顯示,而應僅在循環結...
    程式設計 發佈於2024-11-08
  • JavaScript 中的聲明式程式設計與命令式程式設計
    JavaScript 中的聲明式程式設計與命令式程式設計
    當談到程式設計方法時,經常會出現兩種常見的方法:聲明式程式設計和命令式程式設計。每個都有其優點和理想的用例,尤其是在 JavaScript 中。讓我們透過一些例子來探討這兩種風格。 命令式程式設計:告訴電腦如何做 命令式程式設計就像是給出一組詳細的指令。你告訴計算機如何一步一步達到...
    程式設計 發佈於2024-11-08
  • 掌握 NestJS 中的資料驗證:類別驗證器和類別轉換器的完整指南
    掌握 NestJS 中的資料驗證:類別驗證器和類別轉換器的完整指南
    Introduction In the fast-paced world of development, data integrity and reliability are paramount. Robust data validation and efficient handl...
    程式設計 發佈於2024-11-08
  • 有多少 Python 套件的版本控制正確?
    有多少 Python 套件的版本控制正確?
    前幾天,當我研究Python套件中的漏洞資料庫時,我意識到其中的一些套件版本無法輕鬆解析並與其他版本字串進行比較,因為它們不遵守Python 版本控制- 舊的PEP 440或取代它的版本說明符規範。所以我開始想知道這種情況有多普遍。 Python 套件索引上有多少套件實際上有有效版本? 顯而易見的...
    程式設計 發佈於2024-11-08
  • 如何在 Web 應用程式中有效地對 Ajax 請求進行排序?
    如何在 Web 應用程式中有效地對 Ajax 請求進行排序?
    排序 Ajax 請求在許多 Web 應用程式中,通常會遇到需要迭代集合並對每個元素發出 Ajax 請求的情況。雖然利用非同步請求來避免瀏覽器凍結很誘人,但有效管理這些請求可以防止伺服器過載和其他潛在問題。 jQuery 1.5 對於 jQuery 1.5 及更高版本,$. ajaxQueue() 插...
    程式設計 發佈於2024-11-08
  • JavaScript 中「%」運算子的作用是什麼?
    JavaScript 中「%」運算子的作用是什麼?
    揭開 JavaScript 中 % 運算子的本質JavaScript 中神秘的 % 符號稱為模運算子。它在數學運算中發揮關鍵作用,它會傳回一個運算元除以另一個運算元後的餘數。 模運算子通常表示如下:var1 % var2其中var1 和 var2 代表操作數。 例如,如果我們有表達式 12 % 5,...
    程式設計 發佈於2024-11-08
  • 檢測過時的描述
    檢測過時的描述
    開發人員文件通常在每個文件中包含說明。這些描述可能會過時,導致混亂和不正確的資訊。為了防止這種情況,您可以使用一些 AI 和 GenAIScript 來自動偵測文件中過時的描述。 Markdown 和 frontmatter 許多文檔系統使用 markdown 格式來編寫文檔,並使...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3