Search code examples
gomgo

Converting Method to generic way, finding with mgo


I'm trying to get getObj() function will be more general and could work with any type, not only User like in my code. I was thinking in return a interface instead a defined struct, but I can't fit this idea to my code, please could someone give me a hand with this?
Thanks in advance

type User struct {
    FirstName  string        `bson:"first_name"`
    LastName   string        `bson:"last_name"`
}

type Mbase struct {
    coll *mgo.Collection
    sess *mgo.Session
}

func (b *Mbase) getObj(attr string, val string) (res *User, err error) {
    err = b.coll.Find(bson.M{attr: val}).One(&res)
    if err != nil {
        return
    }
    err = nil
    return
}

Solution

  • You can do something like:

    func (b *Mbase) GetObj(attr string, val string, result interface{}) error {
        return b.coll.Find(bson.M{attr: val}).One(result)
    }
    

    Doesn't feel like the helper is doing much good, though. Find+One itself is already generic. I'd also consider using bson.D{{attr, val}} instead of bson.M if that's all you need.

    Also, please consider asking questions in a single forum at a time.