Go 比戈的戈朗单身汉
我正在试用Golang和Beego。我来自Java/Spring背景,在为我正在开发的webapp实现单例模式时遇到了一些困难。我有一个控制器(我想成为一个单例),我的控制器中有一个服务(我也想成为一个单例)。我想如果我将我的服务作为指针,那么我将始终使用相同的地址(单例)。事实证明并非如此 我的路线是这样的Go 比戈的戈朗单身汉,go,singleton,beego,Go,Singleton,Beego,我正在试用Golang和Beego。我来自Java/Spring背景,在为我正在开发的webapp实现单例模式时遇到了一些困难。我有一个控制器(我想成为一个单例),我的控制器中有一个服务(我也想成为一个单例)。我想如果我将我的服务作为指针,那么我将始终使用相同的地址(单例)。事实证明并非如此 我的路线是这样的 beego.Router("/", &controllers.SessionController{}, "get:Login") 我的SessionController看起来像这
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()
}
}
每次请求时,我的日志总是显示用户服务为零。如何使用我的用户服务的单个(仅初始化一次)实例获取控制器的单个实例?将用户服务设置为单个实例:
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
}
}
将用户服务设为单例:
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
}
}
Beego框架的一位创建者向我提到,该框架会为每个请求创建一个新的控制器实例,因此实际上不可能创建一个单例:(1个Beego框架的创建者向我提到,该框架会为每个请求创建一个控制器的新实例,因此不可能真正创建一个单例:(以下是关于在Golang中创建单例的所有知识
以下是有关在Golang创建singleton的所有信息
我怀疑我们为什么不在任何路由器中直接使用globalUserService。是耦合还是任何原因?谢谢。我怀疑我们为什么不在任何路由器中直接使用globalUserService。是耦合还是任何原因?谢谢。
import (
"sync"
)
type singleton struct {
}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}