只适用于单线程环境

package main

import "fmt"

type Single struct {

}

var single *Single

func GetSingle() *Single {
if single == nil {
single = &Single{}
}
return single
} func main() {
fmt.Printf("%p\n", GetSingle())
fmt.Printf("%p\n", GetSingle())
fmt.Printf("%p\n", GetSingle())
}

支持并发版本

package main

import (
"fmt"
"sync"
"time"
) type Single2 struct { } var single2 *Single2
var lock *sync.Mutex = &sync.Mutex{} func GetSingle2() *Single2 {
lock.Lock()
defer lock.Unlock()
if single2 == nil {
single2 = &Single2{}
}
return single2
} func main() {
go fmt.Printf("%p\n", GetSingle2())
go fmt.Printf("%p\n", GetSingle2())
go fmt.Printf("%p\n", GetSingle2())
time.Sleep(time.Second)
fmt.Println("done")
}

优化并发版本

package main

import (
"fmt"
"sync"
"time"
) type Single2 struct { } var single2 *Single2
var lock *sync.Mutex = &sync.Mutex{} func GetSingle2() *Single2 {
if single2 == nil {
lock.Lock()
defer lock.Unlock()
if single2 == nil {
single2 = &Single2{}
}
}
return single2
} func main() {
go fmt.Printf("%p\n", GetSingle2())
go fmt.Printf("%p\n", GetSingle2())
go fmt.Printf("%p\n", GetSingle2())
time.Sleep(time.Second)
fmt.Println("done")
}

sync.Once版本

package main

import (
"fmt"
"sync"
"time"
) type Single3 struct { } var once sync.Once
var single3 *Single3 func GetSingle3() *Single3 {
once.Do(func() {
single3 = &Single3{}
})
return single3
} func main() {
go fmt.Printf("%p\n", GetSingle3())
go fmt.Printf("%p\n", GetSingle3())
go fmt.Printf("%p\n", GetSingle3())
time.Sleep(time.Second)
fmt.Println("done")
}

Golang 实现单例模式的更多相关文章

  1. Golang 单例模式 singleton pattern

    在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singleton         ...

  2. Golang 常见设计模式之单例模式

    之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式.单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在.根据这一特 ...

  3. GoLang设计模式04 - 单例模式

    单例模式恐怕是最为人熟知的一种设计模式了.它同样也是创建型模式的一种.当某个struct只允许有一个实例的时候,我们会用到这种设计模式.这个struct的唯一的实例被称为单例对象.下面是需要创建单例对 ...

  4. golang单例模式

    1.定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问. 2.分类: 懒汉方式:指全局的单例实例在第一次被使用时构建. 饿汉方式:指全局的单例实例在类装载时构建. 3.实现: (1)懒汉方 ...

  5. golang 依赖控制反转(IoC)

    主流开发语言,为了达到项目间的低耦合,都会借助IoC框架来实现.即抽象和实现分离,使用抽象层,不用关心这些抽象层的具体实现:抽象层的实现,可以独立实现.现在比较流行的领域驱动设计(ddd),为了达到将 ...

  6. Golang学习--TOML配置处理

    上一篇文章中我们学会了使用包管理工具,这样我们就可以很方便的使用包管理工具来管理我们依赖的包. 配置工具的选择 但我们又遇到了一个问题,一个项目通常是有很多配置的,比如PHP的php.ini文件.Ng ...

  7. GO 单例模式

    wiki百科: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比 ...

  8. 你真的会用go语言写单例模式吗?

    最近在学习Golang,想着可以就以前的知识做一些串通,加上了解到go语言也是面向对象编程语言之后.在最近的开发过程中,我碰到一个问题,要用go语言实现单例模式.本着“天下知识,同根同源”(我瞎掰的~ ...

  9. Go语言如何实现单例模式

    单例模式是常见的设计模式,被广泛用于创建数据库,redis等单实例.作用在于可以控制实例个数节省系统资源 特点: 保证调用多次,只会产生单个实例 全局访问 单例的分类 单例模式大致分为2大类: 懒汉式 ...

随机推荐

  1. 洛谷 P5146 最大差值 题解

    P5146 最大差值 题目描述 HKE最近热衷于研究序列,有一次他发现了一个有趣的问题: 对于一个序列\(A_1,A_2\cdots A_n\)​,找出两个数\(i,j\),\(1\leq i< ...

  2. 干货 | column generation求解VRPTW问题 java代码分享

    00 前言 经过小编不断的努力,关于column generation求解VRPTW的代码终于新鲜出炉啦. 01 运行说明 关于这部分的代码,这里提供两个版本. 第一个版本GitHub一个叫Semin ...

  3. Glider(前缀和+二分)

    题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...

  4. Beta冲刺(2/5)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 数据库实践 提交记录(全组共用) 接下来的计划 加快校园百科的进度 还剩下哪些任务 学习软工的理论课 学习代码评估.测试 ...

  5. 【Excel】定位条件快速将空值替换为指定值

    现有如下表格,表格中存在一些空值,如下图: 目的 将上图的空值全部赋值为100,实现后效果如下: 实现步骤 1.选中数字区域,按CTRL+G 2.点击[定位条件]后,选择[空值]后[确定] 3.在编辑 ...

  6. IDEA版本控制忽略文件或目录

    写在前面 废话不多说了, 新创建了个helloworld, 见图: 这谁受得了啊 修改配置 在上图红框内部的后面添加: *.iml;*.idea;*.gitignore;*.sh;*.classpat ...

  7. Cache busting

    Cache busting https://www.keycdn.com/support/what-is-cache-busting https://curtistimson.co.uk/post/f ...

  8. 部分NLP工程师面试题总结

    面试题 https://www.cnblogs.com/CheeseZH/p/11927577.html 其他 大数据相关面试题 https://www.cnblogs.com/CheeseZH/p/ ...

  9. EFProf用法

    SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句,用于检测性能,查找问题.Entity Framework 也有它的跟踪工具EFProf,用于跟踪Enti ...

  10. Python3 多线程(连接池)操作MySQL插入数据

    1.主要模块DBUtils : 允许在多线程应用和数据库之间连接的模块套件Threading : 提供多线程功能 2.创建连接池PooledDB 基本参数: mincached : 最少的空闲连接数, ...