Go中单例模式通过结构体与包级变量实现,推荐使用sync.Once保证线程安全的懒汉式初始化。1. 懒汉式在首次调用GetInstance时创建实例,利用sync.Once确保唯一性;2. 饿汉式在包加载时即初始化,无需加锁但可能浪费资源;3. 两者均通过全局访问点返回同一实例,示例验证s1与s2地址相同,证明单例有效。

在Go语言中,单例模式用于确保一个类(或结构体)在整个程序运行期间只有一个实例,并提供一个全局访问点。由于Go没有类的概念,我们通常使用结构体配合包级变量和同步机制来实现单例模式。
懒汉式指的是在第一次调用时才创建实例,适合资源敏感的场景。使用sync.Once可以保证初始化只执行一次,是推荐的做法。
示例代码:
package singleton
import (
"sync"
)
type Singleton struct {
Data string
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{
Data: "初始化数据",
}
})
return instance
}
说明:
立即学习“go语言免费学习笔记(深入)”;
饿汉式在包加载时就创建好实例,适用于实例创建成本不高、一定会用到的场景。
package singleton
type Singleton struct {
Data string
}
var instance = &Singleton{
Data: "立即初始化的数据",
}
func GetInstance() *Singleton {
return instance
}
特点:
无论哪种方式,使用方式一致:
package main
import (
"fmt"
"your-module/singleton"
)
func main() {
s1 := singleton.GetInstance()
s2 := singleton.GetInstance()
fmt.Printf("s1 == s2: %t\n", s1 == s2) // 输出 true
fmt.Println(s1.Data)
}
输出结果会显示两个变量指向同一个实例,证明单例有效。
基本上就这些。Go中通过sync.Once实现懒加载单例是最常见且推荐的方式,简单又安全。以上就是Golang Singleton单例模式实现示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号