首页 > 解决方案 > 如何在 Go 中模拟 MongoDB 时添加克隆和复制功能?

问题描述

我读了这篇文章,它有很好的在 Go 中模拟 MongoDB 的指南。Clone()但在方法上也存在一些问题Copy()。我创建了这个接口和结构:

type ISession interface {
    DB(name string) IDatabase
    Close()
    Clone() ISession
    Copy() ISession
}

type IDatabase interface {
    C(name string) ICollection
}

type MongoSession struct {
    dbSession *mgo.Session
}

func (s MongoSession) DB(name string) IDatabase {
    return &MongoDatabase{Database: s.dbSession.DB(name)}
}

func (s MongoSession) Clone() ISession {
    //return session.clone
    return s.dbSession.Clone()
}

func (s MongoSession) Copy() ISession {
    return s.dbSession.Copy()
}

但我得到了这个错误

不能在返回参数中使用 s.dbSession.Clone() (类型 *mgo.Session) 作为 ISession 类型: *mgo.Session 没有实现 ISession (Clone 方法的类型错误) 有 Clone() *mgo.Session 想要 Clone()会话

不能在返回参数中使用 s.dbSession.Copy() (类型 *mgo.Session) 作为类型 ISession:*mgo.Session 没有实现 ISession(克隆方法的类型错误)有 Clone() *mgo.Session 想要 Clone()会话

如何添加接口Clone()Copy()方法?

标签: mongodbgomgo

解决方案


MongoSession.Copy()并且MongoSession.Clone()必须返回一个实现ISession. 基本上,您MongoSession正是为此创建类型:实现ISession.

mgo.Session没有实现你的ISession接口(例如,因为它的Session.Clone()方法的返回类型是*mgo.Sessionand not ISession)。您应该创建并返回 的新值MongoSession,您可以在其中包装复制或克隆的*mgo.Session值。

像这样:

func (s MongoSession) Clone() ISession {
    return MongoSession{dbSession: s.dbSession.Clone()}
}

func (s MongoSession) Copy() ISession {
    return MongoSession{dbSession: s.dbSession.Copy()}
}

推荐阅读