使用 sync.Once 可实现线程安全的懒加载单例,保证全局唯一实例;通过 init 函数可实现饿汉式单例,启动即初始化;推荐 sync.Once 方式,兼顾并发安全与延迟加载。

在 Golang 中实现单例模式,关键在于确保一个类(结构体)在整个程序生命周期中只创建一个实例,并提供一个全局访问点。由于 Go 没有类的概念,我们通过结构体和包级变量来模拟这一行为。下面介绍几种常见且安全的实现方式。
sync.Once 是 Go 标准库中用于保证某段代码只执行一次的工具,非常适合用来实现单例模式。
示例代码:
package singleton
<p>import (
"sync"
)</p><p>type Singleton struct {
Data string
}</p><p>var instance *Singleton
var once sync.Once</p><p>func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{
Data: "我是唯一的实例",
}
})
return instance
}</p>这种方式的优点是:
- 线程安全,多个 goroutine 同时调用 GetInstance 不会创建多个实例。
- 延迟初始化,只有在第一次调用时才创建实例,节省资源。
Go 包中的 init 函数会在程序启动时自动执行,且只执行一次,可以利用它来初始化单例。
示例代码:
package singleton
<p>type Singleton struct {
Data string
}</p><p>var instance *Singleton</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/816">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175679962217812.png" alt="天工AI">
</a>
<div class="aritcle_card_info">
<a href="/ai/816">天工AI</a>
<p>昆仑万维推出的国内首款融入大语言模型的AI对话问答、AI搜索引擎,知识从这里开始。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="天工AI">
<span>400</span>
</div>
</div>
<a href="/ai/816" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="天工AI">
</a>
</div>
<p>func init() {
instance = &Singleton{
Data: "通过 init 初始化",
}
}</p><p>func GetInstance() *Singleton {
return instance
}</p>这种方式简单直接,但实例在程序启动时就创建,不支持延迟加载。适用于启动开销小、必定会使用的场景。
两种方式各有适用场景:
- 饿汉式(init 初始化):适合实例创建成本低、一定会用到的情况,启动即加载,避免首次调用延迟。
- 懒汉式(sync.Once):适合创建开销大或可能不会被使用的场景,按需加载更高效。
- 在并发环境下,推荐使用 sync.Once 方式,避免竞态条件。
可以通过打印指针地址来验证是否为同一实例:
package main
<p>import (
"fmt"
"your-package/singleton"
)</p><p>func main() {
s1 := singleton.GetInstance()
s2 := singleton.GetInstance()
fmt.Printf("s1 地址: %p\n", s1)
fmt.Printf("s2 地址: %p\n", s2)
// 输出相同地址,证明是同一个实例
}</p>如果两个实例的内存地址一致,说明单例成功生效。
基本上就这些。Golang 实现单例不复杂,关键是选对方法并保证并发安全。sync.Once 是最推荐的方式,简洁又可靠。
以上就是如何用Golang实现单例模式保证唯一实例_Golang 单例模式实例保证实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号