duanrong6802 2019-03-22 03:26
浏览 68
已采纳

Singleton实例继续在Go中创建新实例

I am using redis to store sessions for my Go simple web app. For this, I only want a single session to access the redis connection at a time. I searched up on implementing singleton objects in Go and followed. This is the code I'm currently implementing:

Redis connection:

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 Implementation:

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.

Everytime I get the connection, the redis connection file creates a new instance of the connection. How do I create a new connection once and just return that connection everytime? Thanks!

  • 写回答

1条回答 默认 最新

  • dongtuo2373 2019-03-23 03:14
    关注

    Comments to the initial question solve the issue, but just to provide a complete solution your code can look like:

    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
    }
    

    Just a couple of extra notes:

    • No need to specify nil as an initial value of pointers, zero value for them is nil by default (var singleCache *cache vs var singleCache *cache = nil).
    • You should handle potential error returned by redis.DialURL and not just skip it with _.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘