这是 Beta 面试指南,内容结构、题目覆盖和示例答案可能会继续调整。
实现单例模式
🟡 中等题目描述
使用 sync.Once 实现一个线程安全的单例模式。
参考答案
package singleton
import "sync"
type Singleton struct {
value int
}
var (
instance *Singleton
once sync.Once
)
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{value: 42}
})
return instance
}关键点
- sync.Once 保证:函数只执行一次
- 线程安全:多个 goroutine 同时调用,只有一个执行初始化
- 延迟初始化:首次调用时才创建实例
扩展:为什么不用双重检查锁?
// ❌ Go 不需要双重检查锁
var mu sync.Mutex
func GetInstance() *Singleton {
if instance == nil { // 第一次检查
mu.Lock()
defer mu.Unlock()
if instance == nil { // 第二次检查
instance = &Singleton{}
}
}
return instance
}Go 的 sync.Once 已经优化了性能,双重检查锁没有优势。