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

Singleton实例继续在Go中创建新实例,go,redis,Go,Redis,我正在使用redis为我的Go simple web应用程序存储会话。 为此,我一次只需要一个会话来访问redis连接。 我在Go中搜索实现singleton对象,并进行了跟踪。 这是我目前正在实施的代码: Redis连接: Redis实现: 每次我获得连接时,redis连接文件都会创建一个新的连接实例。 如何创建一次新连接,然后每次都返回该连接? 谢谢 对初始问题的注释可以解决问题,但为了提供完整的解决方案,您的代码可以如下所示: package Datab import ( "sy

我正在使用redis为我的Go simple web应用程序存储会话。 为此,我一次只需要一个会话来访问redis连接。 我在Go中搜索实现singleton对象,并进行了跟踪。 这是我目前正在实施的代码:

Redis连接: Redis实现: 每次我获得连接时,redis连接文件都会创建一个新的连接实例。 如何创建一次新连接,然后每次都返回该连接?
谢谢

对初始问题的注释可以解决问题,但为了提供完整的解决方案,您的代码可以如下所示:

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 vs var singleCache*cache=nil。 您应该处理redis.DialURL返回的潜在错误,而不仅仅是用3;跳过它。
singleCache:=&cache{}=>这是一个简短的变量声明,它创建了一个新的局部变量,覆盖了全局变量。使用赋值:singleCache=&cache{}。同时,这对于并发使用也是不安全的。最好是在包init函数中初始化singleCache或使用一次。如果需要延迟初始化,请执行该操作。@icza哦,该死的,我太笨了!那很有魅力!谢谢。是的,我计划使用互斥锁来锁定我的线程并使其线程安全。请注意Redigo。您需要使用互斥来控制对连接方法的访问,或者将缓存字段更改为池。请尝试使用该选项
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.
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
}