我建议不要使用这样的全局会话。相反,您可以创建负责所有数据库交互的类型。例如:
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驱动程序表现良好,因为会话是在内部缓存和重用/维护的。每个会话也将在使用时由独立的套接字支持,并且可以配置独立的设置,并且还具有独立的错误处理。如果使用单个全局会话,这些最终将要处理。



