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

私のログは、リクエストごとにユーザーサービスがゼロであることを常に示しています。ユーザー サービスの 1 つの (1 回だけ初期化される) インスタンスを使用して、コントローラーの 1 つのインスタンスを取得するにはどうすればよいですか?

4

3 に答える 3

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
    }
}
于 2014-06-01T17:17:41.980 に答える
0

Golangでシングルトンを作成するために知っておくべきことはすべてここにあります

Go のシングルトン パターン

var instance *singleton

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

しかし、それは THREAD SAFE ではありません。 Sync once の例を使用する必要があります:-

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 に答える