2014-12-15 6 views
2

У меня есть функция вроде следующего для запросов к базе данных Монго:Передача различных структур функции (GO)?

func findEntry(db, table string, entry *User, finder *bson.M) (err error) { 
    c := mongoSession.DB(db).C(table) 
    return c.Find(finder).One(entry) 
} 

я хотел бы повторно использовать функцию для других, чем «User» структур, передав указатель на какой-либо объект, экземпляр структуры - просто не совсем уверен в правильной семантике для этого. Я думаю, что я должен это сделать, сделав параметр «entry» интерфейсом {}, и тогда мне нужно будет использовать отражение, чтобы «отбросить» его обратно на исходную структуру, чтобы вызов функции One() мог правильно заполнить в структуре на вызов? Есть ли «лучший» способ сделать это (пожалуйста, не пылайте отсутствием дженериков, я просто ищу практическое решение, используя лучшие практики).

+1

вот как вы это делаете, нет другого пути :) и не пылает идиомами. –

+0

Если ваша функция на самом деле одна линия длинная (распространяется на две строки): Почему бы не выполнить несколько таких функций, как findUser findOther, findSomethingElse ...? – Volker

ответ

2

Используйте эту функцию:

func findEntry(db, table string, entry interface{}, finder bson.M) error { 
    c := mongoSession.DB(db).C(table) 
    return c.Find(finder).One(entry) 
} 

и называют это нравится:

var user User 
err := findEntry("db", "users", &user, bson.M{"name": "John"}) 

Информация о типе для user передается через findEntry методу One. Нет необходимости в отражении или «отливке» в findEntry.

Кроме того, используйте bson.M вместо *bson.M. Здесь нет необходимости использовать указатель.

Я создал an example on the playground, чтобы показать, что информация о типе передается через findEntry.

+0

запись должна быть подтверждена так: val, ok: = entry. (* Пользователь). И затем отправьте этот val в метод One – Minty

+0

@Minty Утверждение типа не требуется. Запустите [этот пример игровой площадки] (http://play.golang.org/p/RTmJscfboj), чтобы увидеть демонстрацию информации о типе, проходящей через функцию, аналогичную функции findEntry OP. –

+0

это правда, если вы используете пакет fmt. Но что, если вы используете сторонний API, как, например, используемый выше? Ему нужна ссылка на конкретную структуру, чтобы «размотать» данные. – Minty

Смежные вопросы