golang單例模式怎么實(shí)現(xiàn)

小億
91
2023-10-21 16:48:20

Go語(yǔ)言中的單例模式可以通過(guò)以下幾種方式來(lái)實(shí)現(xiàn):

  1. 使用全局變量:定義一個(gè)全局變量,在需要使用單例對(duì)象的地方直接使用該全局變量。在包的初始化函數(shù)中創(chuàng)建并初始化該變量。
package singleton

type singleton struct {
    // ...
}

var instance *singleton

func init() {
    instance = &singleton{
        // ...
    }
}

func GetInstance() *singleton {
    return instance
}
  1. 使用sync.Once實(shí)現(xiàn)懶漢模式:使用sync.Once來(lái)保證只能創(chuàng)建一個(gè)對(duì)象,通過(guò)一個(gè)函數(shù)獲取該對(duì)象。
package singleton

import "sync"

type singleton struct {
    // ...
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{
            // ...
        }
    })
    return instance
}
  1. 使用sync.Mutex實(shí)現(xiàn)餓漢模式:使用sync.Mutex來(lái)保證只能創(chuàng)建一個(gè)對(duì)象,通過(guò)一個(gè)函數(shù)獲取該對(duì)象。
package singleton

import "sync"

type singleton struct {
    // ...
}

var instance *singleton
var mutex sync.Mutex

func GetInstance() *singleton {
    mutex.Lock()
    defer mutex.Unlock()
    if instance == nil {
        instance = &singleton{
            // ...
        }
    }
    return instance
}

這些實(shí)現(xiàn)方法都可以保證只有一個(gè)實(shí)例對(duì)象,并且在需要使用該對(duì)象時(shí)提供統(tǒng)一的訪問(wèn)入口。

0