Go 单例

栏目: Go · 发布时间: 7年前

内容简介:单例的作用不用我多说,大家都知道,那么在go中如何构造单例呢,下面是我的总结。一、 sync.Once用法在Go中有一个简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。

单例的作用不用我多说,大家都知道,那么在 go 中如何构造单例呢,下面是我的总结。

一、 sync.Once用法

在Go中有一个简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。

var (
    once     sync.Once
    instance *SingleTon
)

func GetInstance(str string) *SingleTon {
    once.Do(func() {
        instance = &SingleTon{Attr: str}
    })

    return instance
}

二、使用加锁机制

在Go语言中有个基础对象sync.Mutex,可以实现协程之间的同步逻辑。

var mu sync.Mutex

func GetInstance() *SingleTon {
  mu.Lock()
  defer mu.Unock()

    if Instance == nil {
        instance = &SingleTon{}
    }

    return instance
}

三、简单粗暴模式.

这种方式实现起来特别简单,直接判断一个实力是不是为nil, 如果是,则新生成;否则返回已有的。但它和多数语言一样,只适合用在单线程。这个就很鸡肋,几乎没有什么应用场景,倒是bug经常出在这里。

type SingleTon struct {
}

var instance *SingleTon

func GetInstance() *SingleTon {
    if Instance == nil {
        instance = &SingleTon{}
    }

    return instance
}

测试代码如下,从运行结果来看,都是一致的。

func main() {
    for i := 0; i < 10; i++ {
        go func() {
            s := GetInstance("test:" + strconv.Itoa(i))
            s.TestFunc()
        }()
    }
    time.Sleep(1e5)

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序与民主

程序与民主

皮罗·克拉玛德雷 / 翟小波 / 高等教育 / 2005-3 / 8.20元

《程序与民主》是意大利著名政治学家、法学家皮罗·克拉玛德雷(Pierocalamandrei)(1889-1956)讨论现代诉讼程序的著作。该书篇幅虽小,但影响甚大。国内对该著者及其作品的介绍较少,倒是其弟子卡佩莱蒂的著作已有中文译本:《当事人基本程序保障权与未来的民事诉讼》,徐昕译,法律出版社2000年版。《程序与民主》一书,并非平行地讨论程序和民主,而是从程序的视角讨论民主。这里的民主,也不是......一起来看看 《程序与民主》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具