在 Go 中实现单例模式有几种方法,以下是其中两种常见的方法:
方法一:基于包级别变量
package singleton
type singleton struct {
// 可以在这里添加单例需要的其他字段
}
var instance *singleton
func GetInstance() *singleton {
if instance == nil {
instance = &singleton{}
}
return instance
}
在这种方法中,通过在包级别声明变量 instance 来存储单例对象,并且在 GetInstance 函数中对其进行初始化。这种方法是最简单和直接的,但是不是线程安全的。
方法二:基于 sync.Once
package singleton
import (
"sync"
)
type singleton struct {
// 可以在这里添加单例需要的其他字段
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
在这种方法中,我们使用了 sync.Once 来确保 GetInstance 函数只被执行一次。这种方法是线程安全的,并且能够保证只有一个实例被创建。