最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang設(shè)計(jì)模式之單例模式詳細(xì)講解

 更新時(shí)間:2023年01月11日 16:29:28   作者:Ch3n  
單例模式很容易記住。就像名稱(chēng)一樣,它只能提供對(duì)象的單一實(shí)例,保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)該實(shí)例的方法。本文就來(lái)聊聊Go語(yǔ)言中的單例模式,感興趣的小伙伴可以了解一下

單例模式

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

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

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

概念示例

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

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

一些值得注意的地方:

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

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

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

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: 客戶(hù)端代碼

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.

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

相關(guān)文章

  • Go語(yǔ)言中掃描Redis中大量key的示例代碼

    Go語(yǔ)言中掃描Redis中大量key的示例代碼

    在 Redis 中,當(dāng)我們需要遍歷大量的鍵時(shí),直接使用 KEYS 命令會(huì)面臨性能瓶頸,尤其是在鍵數(shù)量非常多的情況下,今天,我們將通過(guò)兩個(gè)示例代碼,詳細(xì)講解如何在 Go 語(yǔ)言中使用 SCAN 命令遍歷 Redis 鍵,需要的朋友可以參考下
    2024-08-08
  • golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法

    golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法

    這篇文章主要介紹了golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg,下面主要介紹Golang 代碼使用方法及Golang PDF轉(zhuǎn)JPEG的詳細(xì)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 深入解析Go語(yǔ)言中for循環(huán)的寫(xiě)法

    深入解析Go語(yǔ)言中for循環(huán)的寫(xiě)法

    這篇文章主要介紹了Go語(yǔ)言中for循環(huán)的寫(xiě)法,是Golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)

    一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • golang中new與make的區(qū)別講解

    golang中new與make的區(qū)別講解

    new只能開(kāi)辟單個(gè)空間,不能為引用類(lèi)型開(kāi)辟多個(gè)空間,并且new是對(duì)類(lèi)型進(jìn)行內(nèi)存的開(kāi)辟,返回一個(gè)指向該內(nèi)存空間的指針類(lèi)型,如果使用new去初始化引用數(shù)據(jù)類(lèi)型,不是很合適(當(dāng)然,new一個(gè)對(duì)象還是可以的),因此就需要用到另一個(gè)內(nèi)置函數(shù)make,需要的朋友可以參考下
    2023-01-01
  • 基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解

    基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解

    這篇文章主要為大家介紹了基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • golang配置文件解析器之goconfig框架的使用詳解

    golang配置文件解析器之goconfig框架的使用詳解

    goconfig是一個(gè)易于使用,支持注釋的 Go 語(yǔ)言配置文件解析器,該文件的書(shū)寫(xiě)格式和 Windows 下的 INI 文件一樣,本文主要為大家介紹了goconfig框架的具體使用,需要的可以參考下
    2023-11-11
  • 淺談golang的json.Unmarshal的坑

    淺談golang的json.Unmarshal的坑

    本文主要介紹了淺談golang的json.Unmarshal的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • golang通過(guò)node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    golang通過(guò)node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    node_exporter這個(gè)開(kāi)源組件是配合prometheus收集主機(jī)操作系統(tǒng)層的metrics的常用組件,但是官方?jīng)]有提供GPU卡的metrics的采集,今天通過(guò)本文給大家介紹golang通過(guò)node_exporter監(jiān)控GPU及cpu頻率、溫度的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-05-05
  • GoLang context包的使用方法介紹

    GoLang context包的使用方法介紹

    日常Go開(kāi)發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會(huì)有探索的欲望,那么就跟著本篇文章,一起來(lái)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

广安市| 米脂县| 南陵县| 辽阳市| 崇义县| 辽阳市| 织金县| 华亭县| 锦州市| 陕西省| 巴马| 德令哈市| 兴业县| 西乡县| 锡林浩特市| 大港区| 射阳县| 宁明县| 大连市| 永城市| 临海市| 武威市| 平邑县| 蒙山县| 大安市| 永安市| 阿坝县| 徐水县| 陆河县| 额敏县| 黑龙江省| 龙胜| 云龙县| 青神县| 新邵县| 蕉岭县| 伊金霍洛旗| 宁乡县| 思茅市| 常州市| 阜宁县|