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

报告相同问题?

悬赏问题

  • ¥20 Yolov5训练报错
  • ¥15 Unity发布gzip压缩的webgl之后让浏览器可以正常显示画面
  • ¥15 有没有人知道这种提示怎么关?现在不做ts项目了不知道咋关了,求解,现在我以前的js项目都是这种提示了
  • ¥15 为什么mysql做了碎片化处理data_free还是很高
  • ¥15 single positional indexer is out-of-bounds
  • ¥15 LSTM 模型数据量需要多少?
  • ¥15 mysql数据抓包开发报表
  • ¥15 linux系统下安装office打不开
  • ¥20 rsync脚本分发错误,文件不齐全
  • ¥15 labview顺序结构与时间延时