gpt4 book ai didi

go - 单例实例不断在 Go 中创建新实例

转载 作者:可可西里 更新时间:2023-11-01 11:49:23 26 4
gpt4 key购买 nike

我正在使用 Redis 为我的 Go 简单 Web 应用程序存储 session 。为此,我只想让一个 session 一次访问 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 连接文件都会创建一个新的连接实例。如何创建一次新连接并每次都返回该连接?谢谢!

最佳答案

对最初问题的评论解决了问题,但只是为了提供完整的解决方案,您的代码可能如下所示:

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 返回的潜在错误,而不仅仅是使用 _ 跳过它。

关于go - 单例实例不断在 Go 中创建新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com