Go 比戈的戈朗单身汉

Go 比戈的戈朗单身汉,go,singleton,beego,Go,Singleton,Beego,我正在试用Golang和Beego。我来自Java/Spring背景,在为我正在开发的webapp实现单例模式时遇到了一些困难。我有一个控制器(我想成为一个单例),我的控制器中有一个服务(我也想成为一个单例)。我想如果我将我的服务作为指针,那么我将始终使用相同的地址(单例)。事实证明并非如此 我的路线是这样的 beego.Router("/", &controllers.SessionController{}, "get:Login") 我的SessionController看起来像这

我正在试用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()
    }
}

每次请求时,我的日志总是显示用户服务为零。如何使用我的用户服务的单个(仅初始化一次)实例获取控制器的单个实例?

将用户服务设置为单个实例:

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
}