单例设计模式是软件编程中最重要、最常用的设计模式之一。它确保应用程序运行中只有一个例子,并为例子提供全球访问点。在本文中,我们将讨论它 Singleton 如何重要 Golang 它的实现,以及它带来的好处,特别是在并发环境中。
什么是单例?单例是一种将类型的实例限制为单个实例的设计模式。它在需要单点控制或共享资源时特别有用,例如:
我会列出一些关于 Pattern 更有意义的观点也表明,并非一切都是美丽的,我们可能会遇到一些问题。
好处为了实现单例,我将使用它 Golang。在这种语言中,我们必须特别注意并发性,以确保只创建一个例子,即使是多个例子 goroutine 同时尝试访问这个例子也是如此。
为了让我们的例子更接近现实世界,让我们为我们的应用程序创建一个记录器。记录器是应用程序中常用的工具,需要确保日志的一致性。
1 - 定义结构第一,我们定义了我们希望有一个单一的例子结构。
包记录器 进口 ( “FMMT” “同步” ) 类型记录器结构{} var loggerInstance *Logger
Newinstance函数负责返回Singleton结构的单个例子。我们使用互斥锁来确保并发环境的安全,并实现双重检查锁,以提高效率。
包记录器 进口 ( “FMMT” “同步” ) 类型记录器结构{} var 记录器*记录器 var mtx = &sync.Mutex{} func NewInstance() *记录器 { 如果记录器 == nil { mtx.Lock() 延迟 mtx.Unlock() 如果记录器 == nil { fmt.Println("创建新的记录器") 记录器=&记录器{} } } 别的 { fmt.Println("已经创建了记录器") } 返回记录器 }
日志工具总是有一些日志类型,如Info只显示信息、Eror显示错误等。这也是过滤我们想要在应用程序中显示的信息类型的一种方法。
所以让我们创建一个显示它的方法 Info 类型的日志。为此,我们将创建一个接收日志信息的函数,并将其格式化为 INFO 格式。
包记录器 进口 ( “FMMT” “同步” “团队” ) 常量( 信息字符串 =“信息” ) 类型记录器结构{} var 记录器*记录器 var mtx = &sync.Mutex{} func NewInstance() *记录器 { 如果记录器 == nil { mtx.Lock() 延迟 mtx.Unlock() 如果记录器 == nil { fmt.Println("创建新的记录器") 记录器=&记录器{} } } 别的 { fmt.Println("已经创建了记录器") } 返回记录器 } func (l *Logger) Info(消息字符串) { fmt.Printf("%s - %s: %sn", time.Now().UTC().Format(time.RFC3339Nano), INFO, 消息) }
为了使用我们的新记录器,我们将在主包中实例化它,并创建一个日志来检查它是如何工作的。
包主 进口 ( “playground-go/pkg/logger” ) 函数主() { 日志 := logger.NewInstance() log.Info("这是日志的例子") }
这是我们运行程序时的结果:
创建新的记录器 2024-07-03T19:34:57.609599Z - 信息:这是日志的例子
如果我们想测试Newinstance是否真的保证只有一个例子在运行,我们可以做以下测试。
包主 进口 ( “FMMT” “playground-go/pkg/logger” ) 函数主() { 日志 := logger.NewInstance() log.Info("这是日志的例子") log2 := logger.NewInstance() log2.Info("这是日志的另一个例子") 如果日志 == log2 { fmt.Println("同一实例") } 别的 { fmt.Println("不同的实例") } }
我们的日志已经改变了,现在我们可以看到我们阻止了创建新的例子:
创建新的记录器 2024-07-03T19:45:19.603783Z - 信息:这是日志的例子 已经创建了记录器 2024-07-03T19:45:19.603793Z - 信息:这是日志的另一个例子 同一实例
单例模式是一个强大的工具,可以确保在应用程序运行过程中只有一个特定类别的例子。在记录器示例中,我们了解如何应用该模式,以确保整个应用程序中的日志一致性。
我希望这能帮助你更好地理解 Golang 中的 Singleton。
以上是单例设计模式的详细内容,请关注其他相关文章!
OPPO备份恢复,轻松查找,数据无忧!
单例设计模式-Golang
高效远程协作,Win10桌面一触即达!
品质卓越,力荐这几款顶尖免费虚拟主机!
实现 malloc() 和 free() — 进一步减少堆-C
服务器架构:核心基石,支撑高效运算与存储
云服务器:高效灵活,本地难及;本地受限,云上无界
实现 malloc() 和 free() — 进一步减少堆-C
我最近正在开发一种使用方法 go 编写的 cli 最近使用了工具 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我用它 promptui 作为一个提示,没有直接的方法来执行这个操作。本文将展示如何使用promptui。 创建嵌套提示。在这里可以找到完整的代码。
首先,我们需要创建一个空的Go项目。我们称之为嵌套提示:
$ mkdir 嵌套提示 && cd 嵌套提示 $ go mod init <a styl实现 malloc() 和 free() — 将元数据添加到内存块中-C
整数溢出-C
踏上为期一年的软件工程之旅:从 C 到 Python、JavaScript、Node.js、DevOps 等-C
《王者荣耀》元流之子上线时间介绍-手机游戏策略
“最强祖师”升级专业技能道具介绍-手机游戏策略
最强祖师后勤弟子招募策略-手机游戏策略
南宫婉最强祖师的技能强度和玩法策略-手机游戏策略
“绝区零”体力使用策略-手机游戏策略
阴阳师禅心云外镜新皮肤获取策略-手机游戏策略
如何抗腐蚀不朽之旅 《不朽之旅》腐化装备保障机制介绍-手机游戏策略