Redigo Redis Pool真的应该是一个全局变量吗?

Redigo Redis Pool真的应该是一个全局变量吗?,go,redis,redigo,Go,Redis,Redigo,在此示例中,redis池在func main中设置为全局变量。这是一种犹太教的做事方式吗?您真的应该左右使用global varibales,还是有更好、更受欢迎的方法来完成同样的事情?我见过的唯一其他解决方案,例如在“”中: 创建一个struct,它接受一个嵌入的上下文和handler类型,由于ServeHTTP,我们仍然满足http.handler接口 在您的例子中,struct将包括池,以及处理程序函数 type appContext struct { pool Pool } t

在此示例中,redis池在func main中设置为全局变量。这是一种犹太教的做事方式吗?您真的应该左右使用global varibales,还是有更好、更受欢迎的方法来完成同样的事情?

我见过的唯一其他解决方案,例如在“”中:

创建一个
struct
,它接受一个嵌入的上下文和
handler
类型,由于
ServeHTTP
,我们仍然满足
http.handler
接口

在您的例子中,
struct
将包括
,以及
处理程序
函数

type appContext struct {
    pool Pool
}

type appHandler struct {
    *appContext
    h func(a *appContext, w http.ResponseWriter, r *http.Request) (int, error)
}

func (ah appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   ...
}


func main() {
    context := &appContext{
        pool:    ...,
        // any other data
    }
}

由于池被设计为并发使用,因此最终这不是一个问题。不过,您是否想将其用作全局对象是另一个问题:没有任何东西可以阻止您将其嵌入结构或只是从main()传递指针。True。谢谢另外,感谢您的文章链接。我(作为该问题的作者!)也写了一篇关于如何使用该模式的文章:-在大多数情况下,您可以在“context”类型上编写方法并以这种方式传递内容,但是当您需要访问除方法调用之外的上下文时,使用struct方法效果很好(而且是惯用的)。