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

Go設(shè)計模式之單例模式講解和代碼示例

 更新時間:2023年07月26日 08:18:32   作者:demo007x  
單例是一種創(chuàng)建型設(shè)計模式,讓你能夠保證一個類只有一個實例,并提供一個訪問該實例的全局節(jié)點,本文就通過代碼示例給大家講講Go單例模式,需要的朋友可以參考下

Go 單例模式講解和代碼示例.

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

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

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

概念示例

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

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

一些值得注意的地方:

  • 最開始時會有 nil檢查, 確保 single­Instance單例實例在最開始時為空。 這是為了防止在每次調(diào)用 get­Instance方法時都去執(zhí)行消耗巨大的鎖定操作。 如果檢查不通過, 則就意味著 single­Instance字段已被填充。
  • single­Instance結(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.

另一個例子

  • init函數(shù)

我們可以在 init函數(shù)中創(chuàng)建單例實例。 這僅適用于實例的早期初始化工作已經(jīng)確定時。 init函數(shù)僅會在包中的每個文件里調(diào)用一次, 所以我們可以確定其只會創(chuàng)建一個實例。

  • sync.Once

sync.Once僅會執(zhí)行一次操作。 可查看下面的代碼:

syncOnce.go: 單例

package main
import (
    "fmt"
    "sync"
)
var once sync.Once
type single struct {
}
var singleInstance *single
func getInstance() *single {
    if singleInstance == nil {
        once.Do(
            func() {
                fmt.Println("Creating single instance now.")
                singleInstance = &single{}
            })
    } 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.

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

相關(guān)文章

  • Go語言break跳轉(zhuǎn)語句怎么使用

    Go語言break跳轉(zhuǎn)語句怎么使用

    這篇文章主要介紹了Go語言break跳轉(zhuǎn)語句怎么使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • 使用GO語言實現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例

    使用GO語言實現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例

    本文主要介紹了使用GO語言實現(xiàn)Mysql數(shù)據(jù)庫CURD的簡單示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • golang中Context的使用場景

    golang中Context的使用場景

    context包提供了一種在goroutine之間傳遞信號的方法,用于管理請求的生命周期和控制并發(fā)操作,本文主要介紹了golang中Context的使用場景,下面就來介紹一下,感興趣的可以了解一下
    2025-05-05
  • go語言編程之美自定義二進制文件實用指南

    go語言編程之美自定義二進制文件實用指南

    這篇文章主要介紹了go語言編程之美自定義二進制文件實用指南
    2023-12-12
  • Golang如何調(diào)用Python代碼詳解

    Golang如何調(diào)用Python代碼詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何調(diào)用Python代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • 解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG

    解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG

    這篇文章主要介紹了解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言實現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼

    go語言實現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼

    本文主要介紹了go語言實現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 淺析Golang切片截取功能與C++的vector區(qū)別

    淺析Golang切片截取功能與C++的vector區(qū)別

    這篇文章主要介紹了Golang中切片的截取功能與C++中的vector有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • 對Go語言中的context包源碼分析

    對Go語言中的context包源碼分析

    這篇文章主要對Go語言中的context包源碼進行分析,context包析是1.15,context包定義了一個Context類型過這個Context接口類型,?就可以跨api邊界/跨進程傳遞一些值,下面我們就來對context包源碼進行分析,需要的小伙伴可以參考一下
    2022-02-02
  • 使用Go語言創(chuàng)建error的幾種方式小結(jié)

    使用Go語言創(chuàng)建error的幾種方式小結(jié)

    Go語言函數(shù)(或方法)是支持多個返回值的,因此在Go語言的編程哲學中,函數(shù)的返回值的最后一個通常都是error類型,所以本文給大家介紹了使用Go語言創(chuàng)建error的幾種方式小結(jié),文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論