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 _.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题