Go · 46 строк
У клиента от 1 до 12 счетов: карты, вклады, брокерский. Collect грузит операции по каждому счёту в своей горутине и собирает общий список для экрана «Выписка».
Отметьте строки с ошибками.
В работе: Сборка единой выписки по всем продуктам клиента.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: Т‑Банк: секция Go, асинхронность и примитивы синхронизации. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package statementimport ("context""sync")type Operation struct {AccountID stringAmount int64 // копейки}type Loader interface {Load(ctx context.Context, accountID string) ([]Operation, error)}// Collect собирает выписку по всем счетам клиента параллельно.func Collect(ctx context.Context, l Loader, accounts []string) []Operation {var wg sync.WaitGroupout := make(chan []Operation)for _, id := range accounts {wg.Add(1)go load(ctx, l, id, out, wg)}go func() {wg.Wait()close(out)}()var all []Operationfor ops := range out {all = append(all, ops...)}return all}func load(ctx context.Context, l Loader, id string, out chan<- []Operation, wg sync.WaitGroup) {defer wg.Done()ops, err := l.Load(ctx, id)if err != nil {return}out <- ops}