Doporučuji nepoužívat takovou globální relaci. Místo toho můžete vytvořit typ, který je zodpovědný za veškerou interakci s databází. Například:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Tento design má mnoho výhod. Důležité je, že vám umožňuje mít za běhu více relací současně, takže pokud máte například obslužnou rutinu http, můžete vytvořit místní relaci, která je podporována nezávislou relací pouze pro tento jeden požadavek:
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
Ovladač mgo se v takovém případě chová pěkně, protože relace jsou interně ukládány do mezipaměti a znovu používány/udržovány. Každá relace bude také při používání podporována nezávislým soketem a může mít nakonfigurovaná nezávislá nastavení a bude mít také nezávislé zpracování chyb. Toto jsou problémy, se kterými se nakonec budete muset vypořádat, pokud používáte jedinou globální relaci.