Golang設(shè)計(jì)模式之單例模式詳細(xì)講解
單例模式
單例是一種創(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)文章
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ě)法,是Golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
一文帶你了解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
基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解
這篇文章主要為大家介紹了基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
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

