Golang如何实现单例模式_Golang Singleton模式实现方法总结

Go中单例模式通过包级变量和函数实现,常见方式包括:1. 懒汉模式(非并发安全)在首次调用时创建实例,但多协程下存在竞态条件;2. 加锁实现通过sync.Mutex确保线程安全,但每次调用均加锁影响性能;3. 双重检查锁定推荐使用sync.Once,保证初始化函数仅执行一次,兼具安全与效率;4. 饿汉模式在包初始化时创建实例,天然并发安全,适用于初始化成本低的场景。最推荐sync.Once实现的懒加载,兼顾安全性与性能,饿汉模式适合简单场景,选择依据为是否需延迟初始化、性能要求及代码可读性。

golang如何实现单例模式_golang singleton模式实现方法总结

在Go语言中,单例模式用于确保一个类型仅被实例化一次,并提供一个全局访问点。由于Go没有类的概念,通常使用包级变量和函数来实现单例。以下是几种常见的实现方式及其特点。

1. 懒汉模式(非并发安全)

懒汉模式在第一次调用时才创建实例,适合资源初始化较重的场景。但未加锁时在多协程下可能创建多个实例。

示例代码:
var instance *Singleton
type Singleton struct{}

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

这种方式简单,但在高并发下存在竞态条件,不推荐在生产环境直接使用。

2. 加锁实现(并发安全但性能较低)

通过sync.Mutex保证只有一个协程能创建实例,解决并发问题。

var (
    instance *Singleton
    mu       sync.Mutex
)

func GetInstance() *Singleton {
    mu.Lock()
    defer mu.Unlock()
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

虽然线程安全,但每次调用都加锁,影响性能。

3. 双重检查锁定(推荐写法之一)

在加锁前后都检查实例是否已创建,减少锁竞争。

施乐在线订单系统 施乐在线订单系统

一套简单的数据库结构的在线订单系统,采用数据库存储格式,方便的实现产品的在线订购,带有后台管理模块用户名为: admin 密码: ojdj22 修改密码方法如下, 更改 ckpwd.asp 中 第三行 if (user="用户名" and pwd="密码") 即可

施乐在线订单系统 0 查看详情 施乐在线订单系统
var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    if instance == nil {
        once.Do(func() {
            instance = &Singleton{}
        })
    }
    return instance
}
注意: 上面写法有误,正确应只用sync.Once,无需手动判空。 更正如下:
var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

利用sync.Once保证函数仅执行一次,既安全又高效,是推荐做法。

4. 包初始化时创建(饿汉模式)

利用Go的init函数或包变量在程序启动时完成初始化。

var instance = &Singleton{}

type Singleton struct{}

func GetInstance() *Singleton {
    return instance
}

实例在包加载时就创建,天然并发安全,适用于初始化成本不高且必定使用的场景。

基本上就这些常见方式。最推荐的是sync.Once实现的懒加载,兼顾安全与性能。饿汉模式适合简单直接的场景。选择哪种方式取决于具体需求:是否需要延迟初始化、对性能的要求、代码可读性等。

以上就是Golang如何实现单例模式_Golang Singleton模式实现方法总结的详细内容,更多请关注其它相关文章!

本文转自网络,如有侵权请联系客服删除。