在beego的golang单身人士

时间:2014-06-01 15:19:41

标签: go singleton beego

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

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

3 个答案:

答案 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)

Beego框架的创建者之一已经向我提到框架为每个请求创建一个控制器的新实例,因此创建一个单例实际上是不可能的:(

答案 2 :(得分:0)

以下是您在Golang中创建单身人士所需了解的一切

Singleton Pattern in Go

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
}