Предлагам да не използвате подобна глобална сесия. Вместо това можете да създадете тип, който отговаря за цялото взаимодействие с базата данни. Например:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Има много предимства на този дизайн. Важно е, че ви позволява да имате няколко сесии в полет едновременно, така че ако имате http манипулатор, например, можете да създадете локална сесия, която е подкрепена от независима сесия само за тази една заявка:
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
Драйверът mgo се държи добре в този случай, тъй като сесиите се кешират вътрешно и се използват повторно/поддържат. Всяка сесия също ще бъде подкрепена от независим сокет, докато се използва, и може да има конфигурирани независими настройки, а също така ще има независима обработка на грешки. Това са проблеми, с които в крайна сметка ще трябва да се справите, ако използвате една глобална сесия.