登录
首页 >  Golang >  Go问答

在 Go 中频繁创建新实例的单例

来源:stackoverflow

时间:2024-02-27 23:54:22 352浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《在 Go 中频繁创建新实例的单例》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我正在使用 redis 来存储我的 go simple web 应用程序的会话。 为此,我一次只希望有一个会话访问 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 作为指针的初始值,默认情况下它们的零值为 nilvar singlecache *cachevar singlecache *cache = nil)。
  • 您应该处理 redis.dialurl 返回的潜在错误,而不仅仅是使用 _ 跳过它。

今天关于《在 Go 中频繁创建新实例的单例》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>