1

我正在尝试 Golang 和 Beego。我来自 Java/Spring 背景,我在为我正在开发的 web 应用程序实现单例模式时遇到了一些困难。我有一个控制器(我想成为一个单例),并且我的控制器中有一个服务(我也想成为一个单例)。我想如果我让我的服务成为一个指针,那么我总是会使用相同的地址(单例)。事实证明这是不正确的。

我的路线看起来像这样

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()
    }
}

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

4

3 回答 3

2

使用户 Service 成为单例:

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-01T17:17:41.980 回答
2

Beego 框架的创建者中的 1 位向我提到该框架会为每个请求创建一个新的控制器实例,因此实际上不可能创建一个单例 :(

于 2014-06-02T03:08:36.023 回答
0

这是您需要了解的有关在 Golang 中创建单例的所有信息

Go中的单例模式

var instance *singleton

func GetInstance() *singleton {
    if instance == nil {
        instance = &singleton{}   // <--- NOT THREAD SAFE
    }
    return instance
}

但这不是 THREAD SAFE ,您将需要使用一次同步示例:-

import (
    "sync"
) 

type singleton struct {
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}
于 2017-10-16T18:35:35.567 回答