单例模式Golang实现
在 Golang 中,单例模式可以通过使用包级别的变量或者 sync.Once 来实现
包级别的变量
使用包级别的变量可以实现单例模式,因为在 Go 中,包级别的变量只会被初始化一次,可以保证只有一个实例。例如:
package singleton
type Singleton struct {
name string
}
var instance *Singleton
func GetInstance() *Singleton {
if instance == nil {
instance = &Singleton{name: "singleton"}
}
return instance
}
在上面的代码中,我们定义了一个 Singleton 结构体和一个 instance 变量作为单例模式的实例。GetInstance 函数用于获取单例模式的实例,如果实例不存在,则创建一个新的实例并返回,否则返回已经存在的实例
sync.Once
使用 sync.Once 可以保证只有一个 goroutine 初始化单例模式的实例,从而避免了多线程问题。例如:
package singleton
import "sync"
type Singleton struct {
name string
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{name: "singleton"}
})
return instance
}
在上面的代码中,我们使用 sync.Once 来保证只有一个 goroutine 初始化单例模式的实例。在 GetInstance 函数中,我们使用 once.Do 函数来执行初始化操作,如果实例已经被初始化,则不会执行初始化操作
以上两种方式都可以在 Golang 中实现单例模式,具体应该根据实际情况选择