广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言单例模式示例详解
  • 602
分享到

Go语言单例模式示例详解

2024-04-02 19:04:59 602人浏览 独家记忆
摘要

目录简单单例模式加锁的单例模式双check 的单例模式sync.Once 的单例模式简单单例模式 单例模式是创建类型的模式,它是为了保证执行期间内只有一个实例。使用 golang 指

简单单例模式

单例模式是创建类型的模式,它是为了保证执行期间内只有一个实例。使用 golang 指针可以很容易的实现单例模式,通过指针保持相同的引用。

package singleton
type singleton struct{}
var instance = &singleton{}
func getSingleton() *singleton {
    return instance
}

可以看到整个单例模式 由以下部分组成:

  • 私有结构类型,在本例中为 singleton。
  • 指向 singletonCon 类型的私有变量 instance。
  • 一个获取singleton 结构体的函数 getSingleton。

但 getSingleton 函数是直接就返回实例,即包加载时立即被创建。如果单例实例化时初始内容过多,就会导致程序加载用时较长。

进一步优化的方式就是要先用于验证 singletonCon 是否已经初始化。

func getSingleton() *singleton {
    if instance ==nil {
     return instance  = &singleton{}
   }
    return instance
}

通过判断实例是否nil 也不是很可靠。因为如果是多个协程 Goroutine 同时调用该函数时,就无法保证并发安全

加锁的单例模式

解决并发安全最简单的方法就是加锁,可以使用 sync.Mutex 解决。

var mutex sync.Mutex
func getSingleton() *singleton {
    mutex.Lock()
    defer mutex.Unlock()
    if instance ==nil {
     return instance  = &singleton{}
   }
    return instance
}

每次获取对象都需要获取锁然后再判断是否 nil。如果在高度的并发环境下,可能就会导致性能问题。因为其每个协程都需要加锁解锁,就会导致程序性能下降。

双check 的单例模式

加锁有性能问题,不加锁会有并发问题。所以有人提出另一种解决方法:双重锁定的方案。

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

使用两层的 instance == nil 的判断,再在中间加锁。第一层判断可以提告程序效率,不用每次都加锁,非 nil 就可以直接返回实例。第二层的判断就是为了解决并发安全的问题,解决多个协程 goroutine 同时都要加锁时,再由这二层做区分。

sync.Once 的单例模式

可能其他语言会用上面的解决方式,但是在 GO 中有一个 sync.Once 的机制可以优化以上的代码:

var once sync.Once
func getSingleton() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

sync.Once 是 Go 标准库提供的使函数只执行一次的实现。所以它可以保证多个协程 goroutine 同时执行时但是实例只会被创建一次。

Sync.Once 常用的场景:初始化配置,保持数据库连接。所以当一个变量有且仅当第一次被访问时进行初始化,且只初始化一次,就可以使用 sync.Once 控制其初始化。

以上就是Go 语言单例模式示例详解的详细内容,更多关于Go 语言单例模式的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言单例模式示例详解

本文链接: https://www.lsjlt.com/news/121302.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言单例模式示例详解
    目录简单单例模式加锁的单例模式双check 的单例模式sync.Once 的单例模式简单单例模式 单例模式是创建类型的模式,它是为了保证执行期间内只有一个实例。使用 Golang 指...
    99+
    2022-11-11
  • Go语言单例模式详解
    目录什么是单例模式Go中实现单例模式的方式方法一: 懒汉式方法二:饿汉式方法三:双重检查锁定示例总结单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。...
    99+
    2023-03-23
    Go语言单例模式
  • 详解Go语言设计模式之单例模式
    目录单例模式的概念单例模式结构单例模式的使用场景单例模式例子:特殊的计数器第一个单元测试单例模式实现单例模式优缺点单例模式的概念 单例模式很容易记住。就像名称一样,它只能提供对象的单...
    99+
    2022-11-11
  • Go语言基础模板设计模式示例详解
    目录概述模板模式生活案例策略模式涉及到两个角色UML 总结示例概述 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重...
    99+
    2022-11-12
  • go语言http模型reactor示例详解
    目录示例initListenerserveactivateEventLoops前面说了go自带的原生netpoll模型,大致的流程就是每一个新的连接都会开启一个goroutine去处...
    99+
    2023-01-04
    go http模型reactor go reactor模型 go reactor
  • Go语言基础设计模式之策略模式示例详解
    目录概述针对同一类型问题的多种处理方式一、不使用策略模式二、策略模式UML 总结示例 概述 定义一系列算法,将每个算法封装起来。并让它们能够相互替换。策略模式让算法独立于使用它的客户...
    99+
    2022-11-12
  • Go 语言进阶单元测试示例详解
    目录前言测试单元测试规则示例assert覆盖率依赖Mock基准测试前言 本文从单元测试实践角度出发,提升对代码质量的意识。 本文内容主要包括:单元测试、Mock测试、基准测试。 测...
    99+
    2023-01-28
    Go 语言单元测试 Go 单元测试
  • go语言题解LeetCode1160拼写单词示例详解
    目录题目描述思路分析AC 代码 别人用int[26] 解题思路代码c++几乎双百的哈希解法代码题目描述 1160. 拼写单词 - 力扣(LeetCode) 给...
    99+
    2022-12-30
    go题解拼写单词 go LeetCode1160
  • 深入解析Go语言中的单例模式
    单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。在 Go 语言中,实现单例模式有多种方式,本篇文章将带你深入掌握 Go 语言中的单例模式实现。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常应用...
    99+
    2023-05-14
    Go 设计模式
  • Go语言单例模式怎么实现
    这篇文章主要介绍“Go语言单例模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言单例模式怎么实现”文章能帮助大家解决问题。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常...
    99+
    2023-07-05
  • Java设计模式之单例模式示例详解
    目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
    99+
    2022-11-12
  • Go语言基础反射示例详解
    目录概述语法一、基本操作二、修改目标对象三、动态调用方法总结示例 概述 在程序运行期对程序动态的进行访问和修改 reflect godoc: https://golang.org/p...
    99+
    2022-11-12
  • go语言题解LeetCode66加一示例详解
    目录题目描述思路分析AC 代码小结JavaScript 66题代码python3 循环判断分析:JAVA解决进位问题解题思路代码题目描述 原题链接 : 66. 加一 给定一个由 整数...
    99+
    2022-12-30
    go题解LeetCode66加一 go LeetCode66
  • Go语言中的单例模式怎么实现
    本篇内容介绍了“Go语言中的单例模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是单例模式单例模式指仅允许创建一个对象的设计模...
    99+
    2023-07-05
  • go语言reflect.Type 和 reflect.Value 应用示例详解
    目录一、使用 reflect.Type 创建实例二、使用 reflect.Value 调用函数一、使用 reflect.Type 创建实例 在通过 reflect.TypeOf 函数...
    99+
    2022-11-11
  • Go语言字符串基础示例详解
    目录包含Contains(s,substr string) boolContainsAny(s, chars string) bool统计Count(s, substr string...
    99+
    2022-11-12
  • go语言的变量定义示例详解
    目录前言定义单个变量定义多个变量定义相同类型的多个变量变量的初始化变量类型的省略var关键字的省略(简短声明)全局变量与局部变量特别的变量名未使用变量的限制常量前言 特别说明: 本文...
    99+
    2022-12-20
    go语言变量定义 go 变量
  • Go语言基础go接口用法示例详解
    目录概述语法定义接口实现接口空接口接口的组合总结 概述 Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量。 语法 定义接口 type [接口名] inte...
    99+
    2022-11-12
  • 单例模式详解
    目录 一、什么是单例模式 二、单例模式的结构 三、单例模式分类 四、单例模式优缺点 五、创建单例模式 饿汉式 1. 静态成员变量方式 2.静态代码块方式 懒汉式 1.线程不安全 2.线程安全(优化) 3.双重检查锁模式 4. 静态内部类方...
    99+
    2023-10-02
    设计模式 单例模式 java 面试
  • Go语言LeetCode500键盘行题解示例详解
    目录题目描述思路分析AC 代码哈希表判断字符是否出现在某一行中解题思路代码题目描述 原题链接 : 500. 键盘行 - 力扣(LeetCode) (leetcode-cn.com...
    99+
    2022-12-30
    Go语言题解键盘行 Go LeetCode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作