Пытаемся выяснить, как правильно это сделать. Прямо сейчас я могу преобразовать карту bson в свои структуры модели базы данных индивидуально. Но сейчас я просто повторяю много одного и того же кода. Так есть ли лучший способ сделать это?
Пример кода:
type Agent struct {
FirstName string `bson:"firstName,omitempty" json:"firstName,omitempty"`
LastName string `bson:"lastName,omitempty" json:"lastName,omitempty"`
ProfileImage string `bson:"profileImage,omitempty" json:"profileImage,omitempty"`
}
func BSONToAgent(bsonMap primitive.M) (agent Agent, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return agent, err
}
bson.Unmarshal(bsonBytes, &agent)
return agent, nil
}
func BSONArrayToAgents(bsonMap []primitive.M) (agents []Agent, err error) {
for _, item := range bsonMap {
agent, err := BSONToAgent(item)
if err != nil {
return agents, err
}
agents = append(agents, agent)
}
return agents, nil
}
type Form struct {
UserID primitive.ObjectID `bson:"userId,omitempty" json:"userId,omitempty"`
Name string `bson:"name,omitempty" json:"name,omitempty"`
CreatedAt time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
UpdatedAt time.Time `bson:"updatedAt,omitempty" json:"updatedAt,omitempty"`
}
func BSONArrayToForms(bsonMap []primitive.M) (forms []Form, err error) {
for _, item := range bsonMap {
form, err := BSONToForm(item)
if err != nil {
return forms, err
}
forms = append(forms, form)
}
return forms, nil
}
func BSONToForm(bsonMap primitive.M) (form Form, err error) {
bsonBytes, err := bson.Marshal(bsonMap)
if err != nil {
return form, err
}
bson.Unmarshal(bsonBytes, &form)
return form, nil
}
Если вы посмотрите на функции BSONToAgent и BSONToForm, то это почти одна и та же функция, только с другим типом, который она возвращает. И то же самое касается BSONArrayToAgents и BSONArrayToForms. Теперь я хочу реализовать эти функции на всех моих моделях баз данных, чтобы упростить преобразование primitive.M (карта bson), которое возвращается при запросе к базе данных.
Есть ли лучший способ сделать это? Может быть, с помощью интерфейса?