Как получить ключевой объект из возвращенного объекта хранилища данных - PullRequest
0 голосов
/ 24 января 2020

Вот метод, который извлекает все заказы для данного идентификатора заказа пользователя

func (r *DatastoreRepository) FindOrders(ctx context.Context, userID string, orderIDs []string) ([]*domain.Order, interface{}) {
    keys := make([]*datastore.Key, len(orderIDs))
    for i, orderID := range orderIDs {
        key := datastore.NameKey(kindOrder, orderID, nil)
        key.Namespace = userID
        keys[i] = key
    }

    orders := make([]*domain.Order, len(keys))
    multiErrors := r.client.GetMulti(ctx, keys, orders)

    return orders, multiErrors
}

Этот метод возвращает *[]domain.Order моему методу обслуживания. Теперь сервисный метод хочет получить доступ к key объекту данного заказа (чтобы удалить заказ). Один из способов сделать это - заново создать ключ для каждого заказа на основе идентификатора заказа, но это звучит как избыточность кода (я делаю это и в FindOrders, и мне придется делать это также в DeleteOrders). Есть ли способ, которым я могу получить доступ к datastore.key объекту для данного заказа от order object?

1 Ответ

0 голосов
/ 24 января 2020

Предполагая, что Order имеет поле ID, просто l oop над элементами и установите поле.

func (r *DatastoreRepository) FindOrders(ctx context.Context, userID string, orderIDs []string) ([]*domain.Order, interface{}) {
    keys := make([]*datastore.Key, len(orderIDs))
    for i, orderID := range orderIDs {
        key := datastore.NameKey(kindOrder, orderID, nil)
        key.Namespace = userID
        keys[i] = key
    }

    orders := make([]*domain.Order, len(keys))
    multiErrors := r.client.GetMulti(ctx, keys, orders)

    // Add this for loop...
    for i, order := range orders {
       order.ID = orderIDs[i]
    }

    return orders, multiErrors
}
...