Golang|单例模式

  • 单例模式定义:在程序运行期间,某个结构体只创建一个实例。
  • 适用场景:如数据库连接池,在整个程序运行期间只需要一个连接池实例。
  1. 方案一:通过加锁的方式,如读写锁,确保在并发情况下只创建一个实例。
  2. 方案二:使用unit函数,适用于简单的全局变量初始化,但需注意依赖问题。
  3. 方案三:使用once函数,确保在程序运行期间只执行一次初始化操作。
go 复制代码
package tests

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"sync"
)

var single *gorm.DB // 通过gorm.Open()创建的gorm.DB是一个连接池,只需要创建它的一个实例
var once = sync.Once{}
var lock = &sync.Mutex{}

func GetDB1() *gorm.DB {
	if single == nil { //先判断是否为nil,避免无谓的上锁
		lock.Lock()
		defer lock.Unlock()
		if single == nil { //需要二次确认实例尚未创建。如果用sync.Once就不用二次确认
			single, _ = gorm.Open(mysql.Open(""))
		} else {
			fmt.Println("单例已经创建过了")
		}
	} else {
		fmt.Println("单例已经创建过了")
	}
	return single
}

//func init() { //init()只会执行一次,所以可以实现单例。但使用init()通常要小心代码的各种依赖关系,关心代码的执行顺序
//	single, _ = gorm.Open(mysql.Open(""))
//}
//
//func GetDB2() *gorm.DB {
//	return single
//}

func GetDB3() *gorm.DB {
	if single == nil { //先判断是否为nil,避免无谓的once.Do
		once.Do(
			func() {
				single, _ = gorm.Open(mysql.Open(""))
			})
	} else {
		fmt.Println("单例已经创建过了")
	}
	return single
}
相关推荐
雷达学弱狗2 小时前
链式法则解释上游梯度应用
开发语言·前端·javascript
小清兔5 小时前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
奇某人6 小时前
【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】
开发语言·vscode·markdown·mermaid
做一位快乐的码农7 小时前
php程序设计之基于PHP的手工艺品销售网站/基于php在线销售系统/基于php在线购物商城系统
开发语言·php
@珍惜一生@7 小时前
Qt开源库
开发语言·qt·开源
Slaughter信仰8 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm
心灵宝贝8 小时前
Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)
java·开发语言·macos
secondyoung8 小时前
一文丝滑使用Markdown:从写作、绘图到转换为Word与PPT
开发语言·vscode·编辑器·powerpoint·markdown·visual studio·mermaid
雨枪幻。9 小时前
spring boot开发:一些基础知识
开发语言·前端·javascript
爱炸薯条的小朋友9 小时前
C#由Dictionary不正确释放造成的内存泄漏问题与GC代系
开发语言·opencv·c#