首页 > 其他分享 >golang如何实现单例

golang如何实现单例

时间:2024-11-20 16:30:41浏览次数:1  
标签:初始化 Singleton GetInstance instance sync golang 如何 单例

在Go语言中实现单例模式通常有几种方法。单例模式的目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。下面是几种常见的实现方式:
1. 基于包级别的变量(懒汉式)

这是最简单的一种实现方式,通过在包初始化时创建单例对象。

 1 package singleton
 2 
 3 import "sync"
 4 
 5 type Singleton struct {
 6     // 单例对象的属性
 7 }
 8 
 9 var instance *Singleton
10 var once sync.Once
11 
12 func GetInstance() *Singleton {
13     once.Do(func() {
14         instance = &Singleton{}
15     })
16     return instance
17 }

在这个例子中,once.Do() 确保了 instance 只会被初始化一次。sync.Once 是 Go 语言提供的同步原语,用于确保某个操作只执行一次。

 

2. 饿汉式

如果单例对象的初始化不需要参数,且不依赖于其他资源,可以在声明时直接初始化,这种方式称为“饿汉式”。

 1 package singleton
 2 
 3 type Singleton struct {
 4     // 单例对象的属性
 5 }
 6 
 7 var instance = &Singleton{}
 8 
 9 func GetInstance() *Singleton {
10     return instance
11 }

这种方式在程序启动时就完成了单例对象的创建,因此是线程安全的,但是可能造成资源的浪费,因为无论是否需要,都会在程序启动时创建对象。

 

3. 使用 sync.Mutex 实现线程安全(懒汉式)

如果没有 sync.Once,或者你需要更细粒度的控制,可以使用 sync.Mutex 来保证线程安全。

 1 package singleton
 2 
 3 import (
 4     "sync"
 5 )
 6 
 7 type Singleton struct {
 8     // 单例对象的属性
 9 }
10 
11 var (
12     instance *Singleton
13     mutex    sync.Mutex
14 )
15 
16 func GetInstance() *Singleton {
17     if instance == nil {
18         mutex.Lock()
19         defer mutex.Unlock()
20         if instance == nil {
21             instance = &Singleton{}
22         }
23     }
24     return instance
25 }

这里使用了双重检查锁定模式(Double-Check Locking Pattern),确保了多线程环境下的安全性,同时避免了每次调用 GetInstance 函数时都加锁,提高了性能。

以上就是Go语言中实现单例模式的几种常见方式。选择哪种方式取决于你的具体需求,比如是否需要延迟初始化、是否需要线程安全等。

 

标签:初始化,Singleton,GetInstance,instance,sync,golang,如何,单例
From: https://www.cnblogs.com/mrbug/p/18558693

相关文章

  • 【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速?
    【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速?重要性:★★★......
  • 【Linux Ops】如何替换 libstdc++ 提升 GLIBCXX 版本
    【环境】kos5.8sp2,kernel5.10还是上一篇提到的那个软件环境,其依赖的GLIBCXX版本较高,因此在安装时给出了以下错误:xxx:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.29'notfound(requiredbyxxx)执行strings/usr/lib64/libstdc++.so.6|grepGLIBCXX,查看当前环境中......
  • EFCore如何更改跟踪状态
    这里简单介绍下几种修改实体或者导航的跟踪状态。1.直接修改实体对已在DbContext中跟踪的实体,直接操作,如给字段赋值、给导航属性赋值或者添加删除等对未在DbContext中跟踪的实体,调用DbContext的Add、Update、Remove等方法,对已跟踪的实体也有效需要注意所有添加的实体都需要调......
  • 产品规划与市场管理,需求池的重要性?项目集管理攻略,如何提高执行管理效率?
    在现代企业的产品规划和市场管理中,需求池的管理和项目集的有效执行管理至关重要。需求池是将所有潜在的、待解决的客户需求、市场机会和产品改进点收集并集中管理的工具,而项目集管理则是对多个相关项目进行协调与管理的过程,以确保资源的高效使用和项目目标的顺利实现。本文将从需......
  • H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存
    现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面,带来前所未有的个性化体验。EasyPlayer.jsH.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,支持H.264与H.265编码格式,性能稳定......
  • 【Linux Ops】如何无痛升级 glibc
    【环境】kos5.8sp2,kernel5.10最近工作中需要搭建一个软件环境,其依赖的glibc版本较高,因此在安装时给出了以下错误:xxx:/lib64/libc.so.6:version'GLIBC_2.33'notfound(requiredbyxxx)去查看当前机器的libc.so支持的GLIBC版本,发现确实太低了:strings/usr/lib64/......
  • 一文搞懂如何设计自动化测试框架
    什么是自动化项目搭建当一个软件开发工程师接到一个新的Web项目开发的时候,往往需要完成一些准备工作,例如,选择web框架,项目的目录结构设计,数据库的连接配置,Redis/Kafka连接和配置;甚至包括一些基础功能的实现和封装,例如MySQL库增删查改操作的封装,登录功能,以及登录token的验证。这个......
  • 想做程序员高考如何选择专业院校
    文章目录前言一、哪些专业不适合往程序员发展1.军、医等和工作非常对口的专业2.纯文科二、有助于当程序员的专业三、如何选择院校前言是否当程序员和选择什么院校、专业关系不大。有些企业招聘的时候已经不限制选专业,主要还是看重个人的编程能力。一、哪些专业不......
  • 视频流媒体播放器EasyPlayer.js网页直播/点播播放器:如何清除浏览器缓存
    随着科技的飞速发展,流媒体已成为我们日常生活中不可或缺的一部分。从视频娱乐到在线教育,从远程办公到物联网应用,流媒体技术的广泛应用正深刻改变着我们的生活方式。其中,流媒体播放器的核心技术及发展趋势尤为引人关注。EasyPlayer视频流媒体播放器属于一款高效、精炼、稳定且免......
  • 国标GB28181公网直播LiteGBS国标GB28181设备管理软件,海康录播主机出现以下问题如何解
    在现代监控与录播系统中,LiteGBS国标GB28181设备管理软件因其丰富的视频能力与灵活的部署特性,被广泛应用于各类安防监控场景。海康录播主机相关问题以及解决方法1、录播主机互动账号注册失败?一般可能是设备已注册或者平台服务异常导致的。第一种情况可以尝试直接登陆账号,第二......