我正在尝试Golang和Beego。我来自Java/Spring背景,在为我正在开发的for应用程序实现单例模式时,我遇到了一些困难。我有一个控制器(我想成为一个单例),我在我的控制器中有一个服务(我也想成为一个单例)。我想,如果我让我的服务成为一个指针,那么我将总是使用相同的地址(单例)。事实证明这不是真的。
我的路线看起来像这样
beego.Router("/", &controllers.SessionController{}, "get:Login")我的SessionController看起来像这样
type SessionController struct {
baseController
userService *services.UserService
}
func (this *SessionController) Prepare() {
this.baseController.Prepare()
if this.userService == nil {
beego.Info("user service was nil")
this.userService = factories.NewUserService()
}
}我的日志总是显示每次请求时用户服务都是空的。如何使用我的用户服务的单个(仅初始化一次)实例获取控制器的单个实例?
发布于 2014-06-02 01:17:42
使用户服务成为单例:
var globalUserService = factories.NewUserService()
type SessionController struct {
baseController
userService *services.UserService
}
func (this *SessionController) Prepare() {
this.baseController.Prepare()
if this.userService == nil {
beego.Info("user service was nil")
this.userService = globalUserService
}
}发布于 2014-06-02 11:08:36
Beego框架的一个创建者向我提到,框架为每个请求创建一个新的控制器实例,因此不可能创建一个单例:(
发布于 2017-10-17 02:35:36
以下是在Golang中创建单例所需了解的所有内容
Singleton Pattern in Go
var instance *singleton
func GetInstance() *singleton {
if instance == nil {
instance = &singleton{} // <--- NOT THREAD SAFE
}
return instance
}但这不是线程安全的,您需要使用Sync once示例:
import (
"sync"
)
type singleton struct {
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}https://stackoverflow.com/questions/23981330
复制相似问题