Экземпляр Singleton продолжает создавать новые экземпляры в Go - PullRequest
0 голосов
/ 22 марта 2019

Я использую Redis для хранения сеансов для моего простого веб-приложения Go. Для этого я хочу, чтобы только один сеанс одновременно имел доступ к соединению redis. Я искал реализацию одноэлементных объектов в Go и следовал. Это код, который я сейчас реализую:

Redis соединение:

package Datab

import (
    "github.com/gomodule/redigo/redis"
)

type cache struct {
    Conn redis.Conn
}

var singleCache *cache = nil

func GetSessionCache() *cache {

    if singleCache == nil {

        singleCache := &cache{}
        singleCache.Conn, _ = redis.DialURL("redis://localhost")
        // ^ SINGLECACHE IS NOT NIL HERE.

    }
    return singleCache
    // ^ SAYS THIS IS NIL!

}

Redis Реализация:

package Handler

import (
    Datab "videodoox/DB" // this file contains the redis connection implementation
)

connStru := *Datab.GetSessionCache()
cache := connStru.Conn

connStru2 := *Datab.GetSessionCache()
cache2: = connStru.Conn
// ^ THIS CONNECTION HERE IS A COMPLETELY NEW INSTANCE.

Каждый раз, когда я получаю соединение, файл соединения redis создает новый экземпляр соединения. Как мне создать новое соединение один раз и просто возвращать это соединение каждый раз? Спасибо!

1 Ответ

0 голосов
/ 23 марта 2019

Комментарии к первоначальному вопросу решают проблему, но просто для полного решения ваш код может выглядеть следующим образом:

package Datab

import (
    "sync"

    "github.com/gomodule/redigo/redis"
)

type cache struct {
    Conn redis.Conn
}

var singleCache *cache
var initOnce sync.Once

func GetSessionCache() *cache {
    initOnce.Do(func() {
        singleCache := &cache{}
        singleCache.Conn, _ = redis.DialURL("redis://localhost")
    })

    return singleCache
}

Просто пара дополнительных примечаний:

  • Не нужно указывать nil в качестве начального значения указателей, нулевое значение для них по умолчанию равно nil (var singleCache *cache против var singleCache *cache = nil).
  • Вам следует обработать потенциальную ошибку, возвращаемую redis.DialURLи не просто пропустить это с _.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...