如何在Go中正确使用MongoDB会话?

I'm using MongoDB (gopkg.in/mgo.v2 package) as a database in my go app. According to MongoDB best practices I should to open connection when application starting and close it when application is terminating. To verify that connection will be closed I can use defer construction:

session, err := mgo.Dial(mongodbURL)
if err != nil {
    panic(err)
}
defer session.Close()

All will be good if I execute this code in main function. But I want to have this code in separate go file. If I do this session will be closed after method will be executed.What is the best way to open and close session in Golang according MongoDB best practices?

You can do something like this. Create a package which does the Db initialization

    package common

    import "gopkg.in/mgo.v2"

    var mgoSession   *mgo.Session

    // Creates a new session if mgoSession is nil i.e there is no active mongo session. 
   //If there is an active mongo session it will return a Clone
    func GetMongoSession() *mgo.Session {
        if mgoSession == nil {
            var err error
            mgoSession, err = mgo.Dial(mongo_conn_str)
            if err != nil {
                log.Fatal("Failed to start the Mongo session")
            }
        }
        return mgoSession.Clone()
    }

Clone reuses the same socket as the original session.

Now in other packages you can call this method:

package main

session := common.GetMongoSession()
defer session.Close()

Pass the section to the other part of the code after the defer(),

func main(){
    // ... other stuff
    session, err := mgo.Dial(mongodbURL)
      if err != nil {
        panic(err)
      }
    defer session.Close()
    doThinginOtherFile(session) 
}

It looks like you can clone/copy sessions if necessary as long as you have one to clone from.