Войти Регистрация
Конкурентность

9. Загрузка фото карточки товара через errgroup

Сложная

Go · 36 строк

Продавец Wildberries загружает фото карточки товара, до 30 штук по 2–5 МБ. UploadCard грузит их параллельно и возвращает ссылки в порядке файлов: первое фото — обложка.

Отметьте строки с ошибками.

В работе: Портал продавца: создание и редактирование карточки товара.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
errgroupcontextгонка на слайсеотмена

Источник: обзор транскриптов интервью: Wildberries, найди баги в конкурентном коде. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package photos
  2. import (
  3. "context"
  4. "fmt"
  5. "golang.org/x/sync/errgroup"
  6. )
  7. type Storage interface {
  8. Upload(ctx context.Context, name string, data []byte) (string, error)
  9. }
  10. // UploadCard загружает фото карточки товара продавца, до 30 штук.
  11. func UploadCard(ctx context.Context, s Storage, sku int64, files [][]byte) ([]string, error) {
  12. g, gctx := errgroup.WithContext(ctx)
  13. var urls []string
  14. for i, data := range files {
  15. g.Go(func() error {
  16. name := fmt.Sprintf("%d/%d.jpg", sku, i)
  17. url, err := s.Upload(ctx, name, data)
  18. if err != nil {
  19. return fmt.Errorf("фото %d: %w", i, err)
  20. }
  21. urls = append(urls, url)
  22. return nil
  23. })
  24. }
  25. if gctx.Err() != nil {
  26. return nil, gctx.Err()
  27. }
  28. g.Wait()
  29. return urls, nil
  30. }