Mongodb golang mongo延期会议

Mongodb golang mongo延期会议,mongodb,go,mgo,Mongodb,Go,Mgo,我正在从main方法创建mongodb连接,并延迟打开的连接 func main(){ session := db.CreateConnection(connectionStr) defer session.Close() } 问题是我需要将这个sesstion对象传递给user handler struct,并从该传递传递给db handler type UserController struct { DB DBOps } type DBOps struct {

我正在从main方法创建mongodb连接,并延迟打开的连接

func main(){
    session := db.CreateConnection(connectionStr)
    defer session.Close()
}
问题是我需要将这个sesstion对象传递给user handler struct,并从该传递传递给db handler

type UserController struct {
    DB DBOps
}

type DBOps struct {
    session *mgo.Session
}
问题: 我们如何直接创建会话对象和数据库处理程序文件,并在应用程序关闭时延迟该操作

db.go

在main函数中,我可以直接调用

func main(){
    db.Init(connectionstr);
}

但是如何在main方法上延迟此会话对象?

您可以创建全局变量来分配会话对象,从函数返回会话对象。使用会话对象获取数据,然后在从mongo查询后延迟会话

var (
    mgoSession     *mgo.Session
    databaseName = "myDB"
)

func getSession () *mgo.Session {
    if mgoSession == nil {
        var err error
        mgoSession, err = mgo.Dial("localhost")
        if err != nil {
             panic(err) // no, not really
        }
    }
    return mgoSession.Clone()
}

func withCollection(collection string, s func(*mgo.Collection) error)   
{    
    session := getSession()
    defer session.Close()
    c := session.DB(databaseName).C(collection)
    return s(c)
}
我克隆了session对象,并将其返回给用于查询mongo的函数,并在那里延迟会话。
通过上述方法,您可以直接访问处理程序中的会话对象。

相关,请参阅此答案。好的,谢谢。理解。但是,即使在关闭main方法之后,在init上创建的会话仍将存在。这是我的担心?如果您从
main
功能返回,您的整个应用程序将终止,而不会等待其他非
main
goroutines完成。看:好的。。非常感谢。
var (
    mgoSession     *mgo.Session
    databaseName = "myDB"
)

func getSession () *mgo.Session {
    if mgoSession == nil {
        var err error
        mgoSession, err = mgo.Dial("localhost")
        if err != nil {
             panic(err) // no, not really
        }
    }
    return mgoSession.Clone()
}

func withCollection(collection string, s func(*mgo.Collection) error)   
{    
    session := getSession()
    defer session.Close()
    c := session.DB(databaseName).C(collection)
    return s(c)
}