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

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

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

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

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

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

在某些其他上下文中, 你不能使用依賴于單例的類。 你也將必須使用單例類。 絕大多數(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è) get­Instance獲取實(shí)例方法。 該方法將負(fù)責(zé)創(chuàng)建和返回單例實(shí)例。 創(chuàng)建后, 每次調(diào)用 get­Instance時(shí)都會(huì)返回相同的單例實(shí)例。

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

一些值得注意的地方:

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

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.

另一個(gè)例子

  • init函數(shù)

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

  • sync.Once

sync.Once僅會(huì)執(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è)計(jì)模式之單例模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang使用redis實(shí)現(xiàn)全文搜索功能詳解

    golang使用redis實(shí)現(xiàn)全文搜索功能詳解

    這篇文章主要為大家詳細(xì)介紹了golang如何使用redis實(shí)現(xiàn)全文搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串舉例詳解

    Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串舉例詳解

    今天寫代碼遇到數(shù)組轉(zhuǎn)換成字符串操作,下面這篇文章主要給大家介紹了關(guān)于Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 使用Go語(yǔ)言實(shí)現(xiàn)微信公眾平臺(tái)

    使用Go語(yǔ)言實(shí)現(xiàn)微信公眾平臺(tái)

    這篇文章主要介紹了使用Go語(yǔ)言實(shí)現(xiàn)微信公眾平臺(tái),雖然不是全部代碼,但是也是給我們提供了一個(gè)非常好的思路,需要的朋友可以參考下
    2015-01-01
  • go日志庫(kù)logrus的安裝及快速使用

    go日志庫(kù)logrus的安裝及快速使用

    這篇文章主要為大家介紹了go日志庫(kù)logrus的安裝及快速使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • golang限流庫(kù)兩個(gè)大bug(半年之久無(wú)人提起)

    golang限流庫(kù)兩個(gè)大bug(半年之久無(wú)人提起)

    最近我的同事在使用uber-go/ratelimit[1]這個(gè)限流庫(kù)的時(shí)候,遇到了兩個(gè)大?bug,這兩個(gè)?bug?都是在這個(gè)庫(kù)的最新版本(v0.3.0)中存在的,而這個(gè)版本從?7?月初發(fā)布都已經(jīng)過(guò)半年了,都沒(méi)人提?bug,難道大家都沒(méi)遇到過(guò)么
    2023-12-12
  • golang結(jié)合mysql設(shè)置最大連接數(shù)和最大空閑連接數(shù)

    golang結(jié)合mysql設(shè)置最大連接數(shù)和最大空閑連接數(shù)

    本文介紹golang?中連接MySQL時(shí),如何設(shè)置最大連接數(shù)和最大空閑連接數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Go異步任務(wù)解決方案之Asynq庫(kù)詳解

    Go異步任務(wù)解決方案之Asynq庫(kù)詳解

    需要在Go應(yīng)用程序中異步處理任務(wù)? Asynq,簡(jiǎn)單高效的任務(wù)隊(duì)列實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Go異步任務(wù)解決方案之Asynq庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go 語(yǔ)言中指針是很容易學(xué)習(xí)的,Go 語(yǔ)言中使用指針可以更簡(jiǎn)單的執(zhí)行一些任務(wù)。所以本文就來(lái)和大家聊聊Go語(yǔ)言中指針的定義與使用,需要的可以參考一下
    2022-12-12
  • go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理

    go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理

    這篇文章主要為大家介紹了go語(yǔ)言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)

    golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯(cuò)點(diǎn)總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評(píng)論

郯城县| 南宁市| 古蔺县| 呼和浩特市| 枞阳县| 衡阳市| 精河县| 普陀区| 咸阳市| 临沧市| 姚安县| 渭南市| 灵山县| 平原县| 高雄市| 阿巴嘎旗| 桃园县| 中山市| 中阳县| 军事| 扎囊县| 宜章县| 多伦县| 大渡口区| 讷河市| 北流市| 博野县| 合江县| 新乐市| 永康市| 伊金霍洛旗| 罗江县| 岳阳市| 兴文县| 且末县| 银川市| 平安县| 健康| 于田县| 甘谷县| 巫山县|