Je suggère de ne pas utiliser une session globale comme celle-là. Au lieu de cela, vous pouvez créer un type responsable de toutes les interactions avec la base de données. Par exemple :
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Il y a de nombreux avantages à cette conception. Un élément important est qu'il vous permet d'avoir plusieurs sessions en vol en même temps, donc si vous avez un gestionnaire http, par exemple, vous pouvez créer une session locale qui est soutenue par une session indépendante juste pour cette seule requête :
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
Le pilote mgo se comporte bien dans ce cas, car les sessions sont mises en cache en interne et réutilisées/maintenues. Chaque session sera également soutenue par un socket indépendant pendant son utilisation, et peut avoir des paramètres indépendants configurés, et aura également une gestion des erreurs indépendante. Ce sont des problèmes auxquels vous devrez éventuellement faire face si vous utilisez une seule session globale.