Последовательные сетевые запросы

Вывод содержит map с пятью именами и случайными ID, затем <nil>. Пять последовательных пауз по 10 мс занимают примерно не меньше 50 мс.

Короткий ответ

Что ответить на собеседовании

Вывод содержит map с пятью именами и случайными ID, затем . Пять последовательных пауз по 10 мс занимают примерно не меньше 50 мс.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой результат выведет программа. Необходимо разобраться, как работает последовательный вызов функции fetchByName, какое влияние оказывает time.Sleep, и в каком виде будет сформирована возвращаемая карта map[string]int.

package main

import (
 "context"
 "fmt"
 "math/rand"
 "time"
)

type User struct {
 Name string
}

func main() {
 fmt.Println(Do(context.Background(), []User{{"aaa"}, {"bbb"}, {"ccc"}, {"ddd"}, {"eeee"}}))
}

// fetchByName изменять нельзя
func fetchByName(ctx context.Context, userName string) (int, error) {
 time.Sleep(10 * time.Millisecond) // имитация сетевого похода
 return rand.Int() % 100000, nil
}

// все изменения должны производиться в данной функции
func Do(ctx context.Context, users []User) (map[string]int, error) {
 collected := make(map[string]int)
 for _, u := range users {
  userID, err := fetchByName(ctx, u.Name)
  if err != nil {
   return collected, err
  }
  collected[u.Name] = userID
 }
 return collected, nil
}
``

Ответ

Вывод содержит map с пятью именами и случайными ID, затем . Пять последовательных пауз по 10 мс занимают примерно не меньше 50 мс.

Для каждого пользователя fetchByName возвращает число от 0 до 99999 и nil. Конкретные числа заранее не заданы, совпадения ID возможны. Контекст передаётся, но функция его не проверяет, поэтому отмена не прекращает Sleep.

Do выполняет вызовы по одному, сохраняя результаты в карте. Для одинаковых имён последний результат перезаписал бы предыдущий. Ускорение возможно параллельными запросами с безопасным сбором, но обещать ровно 10 мс для произвольного количества пользователей нельзя; исходный код остаётся последовательным.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее