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

Golang基于sync.Once實(shí)現(xiàn)單例的操作代碼

 更新時(shí)間:2022年10月28日 11:14:17   作者:Hugo Lei  
這篇文章主要介紹了golang實(shí)現(xiàn)單例的操作代碼,本文介紹基于sync.Once的方式來(lái)實(shí)現(xiàn)單例,熟練掌握這種模式,并理解其底層原理,對(duì)大部分人來(lái)講已經(jīng)完全夠用了,需要的朋友可以參考下

在go里實(shí)現(xiàn)單例模式有多種方式:

  • 基于lock
  • 基于init函數(shù)
  • 基于sync.Once

本文介紹基于sync.Once的方式來(lái)實(shí)現(xiàn)單例,熟練掌握這種模式,并理解其底層原理,對(duì)大部分人來(lái)講已經(jīng)完全夠用了。

基于sync.Once實(shí)現(xiàn)單例

// 其他package也可見(jiàn),在其他地方也可以new新對(duì)象
// 但是最終調(diào)用Conn()方法時(shí),都是用的single這個(gè)單例
// 1
type Driver struct {
	// 小寫(xiě)字母開(kāi)頭,外部不可訪問(wèn),所以new個(gè)Driver新對(duì)象也沒(méi)用
	// 2
	conn string
}

// 全局變量,指針默認(rèn)值為nil
// 3
var single *Driver // 單例
var once sync.Once

// 對(duì)外暴露的公共方法
func (s *Driver) Conn() {
	fmt.Printf("conn=%s", single.conn) // do something
}

// 4
func GetDriverSingleton() *Driver {
	// 對(duì)GetDriverSingleton()方法的調(diào)用,都會(huì)執(zhí)行once.Do()方法,只不過(guò)參數(shù)func()只會(huì)被執(zhí)行一次
	// 若并發(fā)執(zhí)行once.Do(),多個(gè)協(xié)程會(huì)阻塞,因內(nèi)部是通過(guò)Mutex來(lái)控制
	once.Do(func() {
		single = new(Driver)
		single.conn = "single conn"
		time.Sleep(50 * time.Millisecond)
	})
	return single
}

單例類型定義Driver

Driver類的方法要支持跨包訪問(wèn),因此需要以大寫(xiě)字母開(kāi)頭。
小寫(xiě)字母開(kāi)頭,作用域僅限于包內(nèi)部。

類Field conn

類變量conn需要小寫(xiě)字母開(kāi)頭,跨包不可訪問(wèn),避免在包外被修改。

但是包內(nèi)還是有可能被修改。

once.Do(func() {})

每次調(diào)用GetDriverSingleton(),都會(huì)調(diào)用once.Do()方法,但是在once.Do()方法內(nèi)部,僅會(huì)執(zhí)行一次參數(shù)func(){},因此就保證了單例唯一初始化。

并發(fā)訪問(wèn)once.Do()

不會(huì)有并發(fā)訪問(wèn)問(wèn)題,因once.Do()內(nèi)部通過(guò)mutex來(lái)控制。

// once.DO()
if atomic.LoadUint32(&o.done) == 0 {
	// Outlined slow-path to allow inlining of the fast-path.
	o.doSlow(f)
}

// doSlow()
func (o *Once) doSlow(f func()) {
	o.m.Lock() // 互斥鎖
	defer o.m.Unlock()
	if o.done == 0 {
		defer atomic.StoreUint32(&o.done, 1)
		f()
	}
}

對(duì)外暴露方法Conn()

外部對(duì)Conn()方法的調(diào)用,最終都由單例single來(lái)實(shí)現(xiàn)。

重新new(Driver)會(huì)發(fā)生什么?

很遺憾,無(wú)法將構(gòu)造函數(shù)改成private,也就是說(shuō),在包外部是可以通過(guò)new(Driver)來(lái)創(chuàng)建新的對(duì)象。

但無(wú)論是哪個(gè)對(duì)象,對(duì)公開(kāi)方法Conn()的調(diào)用,最終都是由單例single來(lái)執(zhí)行的。

到此這篇關(guān)于golang實(shí)現(xiàn)單例的操作代碼的文章就介紹到這了,更多相關(guān)go單例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例

    Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例

    日常使用一些軟件時(shí)會(huì)通過(guò)手機(jī)號(hào)碼來(lái)注冊(cè),這就會(huì)用到正則表達(dá)式來(lái)判斷號(hào)碼是否正確,下面這篇文章主要給大家介紹了關(guān)于Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言空結(jié)構(gòu)體詳解

    Go語(yǔ)言空結(jié)構(gòu)體詳解

    本文主要介紹了Go語(yǔ)言空結(jié)構(gòu)體詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用Golang的Context管理上下文的方法

    使用Golang的Context管理上下文的方法

    這篇文章主要介紹了使用Golang的Context管理上下文的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go語(yǔ)言中for和range的性能比較

    Go語(yǔ)言中for和range的性能比較

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中for和range語(yǔ)句的使用以及性能比較,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • Go 值傳遞與引用傳遞的方法

    Go 值傳遞與引用傳遞的方法

    這篇文章主要介紹了Go 值傳遞與引用傳遞的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • 如何使用Go檢測(cè)用戶本地是否安裝chrome

    如何使用Go檢測(cè)用戶本地是否安裝chrome

    這篇文章主要為大家詳細(xì)介紹了如何使用Go檢測(cè)用戶本地是否安裝chrome,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • golang實(shí)現(xiàn)整型和字節(jié)數(shù)組之間的轉(zhuǎn)換操作

    golang實(shí)現(xiàn)整型和字節(jié)數(shù)組之間的轉(zhuǎn)換操作

    這篇文章主要介紹了golang實(shí)現(xiàn)整型和字節(jié)數(shù)組之間的轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • 詳解Golang中errors包如何返回自定義error類型

    詳解Golang中errors包如何返回自定義error類型

    這篇文章主要為大家詳細(xì)介紹了Golang中errors包如何返回自定義error類型,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • Golang輕量級(jí)IoC容器安裝使用示例

    Golang輕量級(jí)IoC容器安裝使用示例

    這篇文章主要為大家介紹了Golang輕量級(jí)IoC容器安裝使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

班戈县| 门源| 靖边县| 遵义县| 堆龙德庆县| 长顺县| 广宗县| 开原市| 天门市| 乌鲁木齐市| 霍林郭勒市| 唐山市| 长岭县| 潢川县| 贵德县| 双辽市| 阳原县| 安庆市| 田林县| 资阳市| 基隆市| 保定市| 南开区| 甘孜| 富川| 卢龙县| 扎囊县| 怀安县| 华阴市| 武义县| 玉山县| 兰溪市| 鄄城县| 南昌市| 邳州市| 鄂伦春自治旗| 蚌埠市| 大城县| 施秉县| 广东省| 无棣县|