只适用于单线程环境

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. Nginx 和 PHP 和 mysql扩展的安装

    1.nginx 安装 2.php的安装 3.php的扩展mysql的安装

  2. Educational Codeforces Round 67

    Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...

  3. CSS3 之loading动画实现思路

    效果大致如下: 主要实现方式: 该效果主要用到animation-timing-function中的steps()函数,该函数主要用于分步隐藏不同模块. 实现思路: 第一步动画: 第二步动画: 第三步 ...

  4. 平安银行Java面试-社招-五面(2019/09)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  5. mysql 分组条件筛选

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  6. Dubbo+Zookeeper的简单入门案例

    1.1  Dubbo简介 Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能.轻量级的开源Java RPC框架,可以和Spring框架无缝集成. 什么是R ...

  7. 基于Hadoop爬虫网易云歌曲评论

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次选取的是爬取歌曲<大碗宽面>的歌评数据 1.将 ...

  8. Net core学习系列(三)——Net Core中的依赖注入

    本文通过一个维修工与工具库的例子形象的描述一下为什么要用依赖注入.它的工作原理是什么样的, 然后根据这个类比一下ASP.NET Core 中的依赖注入, 从而深刻了解它的使用方法.注意事项以及回收机制 ...

  9. PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题

    官方库地址:https://packagist.org/packages/endroid/qr-code PHP5.6 的最高版本为:2.5.1 通过composer安装 composer requi ...

  10. word 转 pdf,c#代码

    通过使用 C# 控制 office 软件 com 组件转 pdf 1 word 转 pdf 方案二:可以使用 netoffice 进行转换 参考文档:https://netoffice.io/docu ...