欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang設計模式之單例模式詳細講解

 更新時間:2023年01月11日 16:29:28   作者:Ch3n  
單例模式很容易記住。就像名稱一樣,它只能提供對象的單一實例,保證一個類只有一個實例,并提供一個全局訪問該實例的方法。本文就來聊聊Go語言中的單例模式,感興趣的小伙伴可以了解一下

單例模式

單例是一種創(chuàng)建型設計模式, 讓你能夠保證一個類只有一個實例, 并提供一個訪問該實例的全局節(jié)點。

單例擁有與全局變量相同的優(yōu)缺點。 盡管它們非常有用, 但卻會破壞代碼的模塊化特性。

在某些其他上下文中, 你不能使用依賴于單例的類。 你也將必須使用單例類。 絕大多數(shù)情況下, 該限制會在創(chuàng)建單元測試時出現(xiàn)。

概念示例

通常而言, 單例實例會在結(jié)構(gòu)體首次初始化時創(chuàng)建。 為了實現(xiàn)這一操作, 我們在結(jié)構(gòu)體中定義一個 getInstance獲取實例方法。 該方法將負責創(chuàng)建和返回單例實例。 創(chuàng)建后, 每次調(diào)用 getInstance時都會返回相同的單例實例。

協(xié)程方面又有什么需要注意的嗎? 每當多個協(xié)程想要訪問實例時, 單例結(jié)構(gòu)體就必須返回相同的實例。 正因如此, 單例設計模式的實施工作很容易出錯。 下方的例子表示了創(chuàng)建單例的正確方式。

一些值得注意的地方:

最開始時會有 nil檢查, 確保 singleInstance單例實例在最開始時為空。 這是為了防止在每次調(diào)用 getInstance方法時都去執(zhí)行消耗巨大的鎖定操作。 如果檢查不通過, 則就意味著 singleInstance字段已被填充。

singleInstance結(jié)構(gòu)體將在鎖定期間創(chuàng)建。

在獲取到鎖后還會有另一個 nil檢查。 這是為了確保即便是有多個協(xié)程繞過了第一次檢查, 也只能有一個可以創(chuàng)建單例實例。 否則, 所有協(xié)程都會創(chuàng)建自己的單例結(jié)構(gòu)體實例。

single.go: 單例

package main
import (
    "fmt"
    "sync"
)
var lock = &sync.Mutex{}
type single struct {
}
var singleInstance *single
func getInstance() *single {
    if singleInstance == nil {
        lock.Lock()
        defer lock.Unlock()
        if singleInstance == nil {
            fmt.Println("Creating single instance now.")
            singleInstance = &single{}
        } else {
            fmt.Println("Single instance already created.")
        }
    } else {
        fmt.Println("Single instance already created.")
    }
    return singleInstance
}

main.go: 客戶端代碼

package main
import (
"fmt"
)
func main() {
    for i := 0; i < 30; i++ {
        go getInstance()
    }
    // Scanln is similar to Scan, but stops scanning at a newline and
    // after the final item there must be a newline or EOF.
    fmt.Scanln()
}

output.txt: 執(zhí)行結(jié)果

Creating single instance now.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.

到此這篇關于Golang設計模式之單例模式詳細講解的文章就介紹到這了,更多相關Go單例模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 初步解讀Golang中的接口相關編寫方法

    初步解讀Golang中的接口相關編寫方法

    這篇文章主要介紹了Golang中的接口相關編寫方法,是Go語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • Go 字符串格式化的實例代碼詳解

    Go 字符串格式化的實例代碼詳解

    這篇文章主要介紹了Go 字符串格式化的實例代碼詳解,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Go語言里的結(jié)構(gòu)體文法實例分析

    Go語言里的結(jié)構(gòu)體文法實例分析

    這篇文章主要介紹了Go語言里的結(jié)構(gòu)體文法,實例分析了結(jié)構(gòu)體文法的概念及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang因Channel未關閉導致內(nèi)存泄漏的解決方案詳解

    Golang因Channel未關閉導致內(nèi)存泄漏的解決方案詳解

    這篇文章主要為大家詳細介紹了當Golang因Channel未關閉導致內(nèi)存泄漏時蓋如何解決,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-07-07
  • 一文帶你了解Golang中的泛型

    一文帶你了解Golang中的泛型

    泛型是一種可以編寫獨立于使用的特定類型的代碼的方法,可以通過編寫函數(shù)或類型來使用一組類型中的任何一個,下面就來和大家聊聊Golang中泛型的使用吧
    2023-07-07
  • Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解

    Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解

    這篇文章主要介紹了Go map底層實現(xiàn)與擴容規(guī)則和特性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • Go語言中通過Lua腳本操作Redis的方法

    Go語言中通過Lua腳本操作Redis的方法

    這篇文章主要給大家介紹了關于Go語言中通過Lua腳本操作Redis的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2018-01-01
  • Go語言中并發(fā)的工作原理

    Go語言中并發(fā)的工作原理

    本文詳細講解了Go語言中并發(fā)的工作原理,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 源碼剖析Golang中singleflight的應用

    源碼剖析Golang中singleflight的應用

    這篇文章主要為大家詳細介紹了如何利用singleflight來避免緩存擊穿,并剖析singleflight包的源碼實現(xiàn)和工作原理,感興趣的可以了解下
    2024-03-03
  • 詳解go語言中type關鍵詞的幾種使用

    詳解go語言中type關鍵詞的幾種使用

    這篇文章主要介紹了詳解go語言中type的幾種使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論