Go语言中单例模式分为饿汉和懒汉模式:饿汉模式在包加载时创建实例,线程安全,适用于轻量且必用场景;懒汉模式首次调用时初始化,节省资源,需用sync.Once保证并发安全,适合高开销或可能不用的对象。

在Go语言中,单例模式是一种常见的设计模式,用于确保一个类在整个程序运行期间只有一个实例。根据实例创建的时机不同,可分为“饿汉模式”和“懒汉模式”。下面分别介绍这两种方式的实现。
饿汉模式(Eager Initialization)
饿汉模式在包加载时就创建好实例,线程安全,适用于实例初始化成本不高且一定会用到的场景。
示例代码:
package singleton
import "fmt"
// 定义单例结构体
type Singleton struct {
Data string
}
// 包初始化时直接创建实例
var instance = &Singleton{Data: "饿汉模式实例"}
// GetInstance 返回唯一实例
func GetInstance() *Singleton {
return instance
}
// 使用示例
func ExampleEager() {
s1 := GetInstance()
s2 := GetInstance()
fmt.Println(s1 == s2) // 输出 true,证明是同一个实例
}
懒汉模式(Lazy Initialization)
懒汉模式在第一次调用获取实例方法时才创建,可以延迟资源消耗,但需注意并发安全问题。使用 sync.Once 可保证只初始化一次。
示例代码:
package singleton
import (
"sync"
)
// 定义单例结构体
type Singleton struct {
Data string
}
var (
instanceLazy *Singleton
once = &sync.Once{}
)
// GetInstanceLazy 第一次调用时创建实例
func GetInstanceLazy() *Singleton {
once.Do(func() {
instanceLazy = &Singleton{Data: "懒汉模式实例"}
})
return instanceLazy
}
// 使用示例
func ExampleLazy() {
s1 := GetInstanceLazy()
s2 := GetInstanceLazy()
fmt.Println(s1 == s2) // 输出 true
}
两种模式对比与选择建议
实际开发中可根据需求选择合适的实现方式:
立即学习“go语言免费学习笔记(深入)”;
- 饿汉模式:启动即创建,简单安全,适合轻量且必用的对象
- 懒汉模式:按需创建,节省资源,适合初始化开销大或可能不用的情况
- 并发环境下推荐使用 sync.Once 实现懒加载,避免竞态条件










