我正在尝试Golang和Beego。我来自Java / Spring背景,我正在为我正在开发的webapp实现单例模式有点困难。我有一个控制器(我想成为一个单身人士),我在我的控制器中有一个服务(我也想成为一个单身人士)。我想如果我把服务作为指针,那么我总是使用相同的地址(单例)。事实并非如此。
我的路线看起来像这样
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()
}
}
我的日志始终显示每个请求的用户服务都是零。如何使用我的用户服务的单个(仅初始化一次)实例来获取我的控制器的单个实例?
答案 0 :(得分:2)
使用户服务成为单身人士:
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
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
以下是您在Golang中创建单身人士所需了解的一切
var instance *singleton
func GetInstance() *singleton {
if instance == nil {
instance = &singleton{} // <--- NOT THREAD SAFE
}
return instance
}
但这不是THREAD SAFE,你需要使用Sync一次 示例: -
import (
"sync"
)
type singleton struct {
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}