Дан HTTP-сервер на Go с одним эндпоинтом /collatz, который принимает одно число и возвращает последовательность Коллат
Условие
Заголовок раздела «Условие»Дан HTTP-сервер на Go с одним эндпоинтом /collatz, который принимает одно число и возвращает последовательность Коллатца для него. Требуется доработать API и реализацию согласно следующим пунктам:
- Расширить API - изменить формат запроса так, чтобы можно было передавать массив чисел, а в ответе возвращать последовательность (или последовательности) для каждого числа;
- Вычислять последовательность конкурентно - для каждого числа из массива запустить отдельную горутину, вычисляющую последовательность Коллатца;
- Реализовать механизм остановки по первому завершившемуся - как только одна из горутин первой завершит вычисление, нужно остановить остальные вычисления и вернуть результат именно этого «победителя»;
- Кешировать результаты - хранить результаты вычислений для каждого числа в map (кеш), чтобы при повторном запросе того же числа не вычислять его заново;
- Обеспечить конкурентный доступ к кешу - использовать механизмы синхронизации для безопасного чтения и записи в map из нескольких горутин;
- Обрабатывать прерывание от пользователя - реализовать возможность корректно завершить вычисления, если клиент разорвал соединение или отменил запрос.
type req struct { Num []int}
type resp struct { Sequence []int}
func main() { mux := http.NewServeMux() mux.HandleFunc("/collatz ", func(w http.ResponseWriter, r *http.Request) { in, _ := io.ReadAll(r.Body) data := &req{} err := json.Unmarshal(in, data) if err != nil { log.Fatalf(err.Error()) } res := &resp{Sequence: collatz(data.Num)} out, err := json.Marshal(res) w.Write(out) })
http.ListenAndServe(":8080 ", mux)}
func collatz(n int) []int { iter := []int{} for n != 1 { iter = append(iter, n) if n%2 == 0 { n = n / 2 continue } n = 3*n + 1 }
return iter}Решение
Заголовок раздела «Решение»Источник: Andersen - 2 · 1 кв 2026
Все задачи · Сети и протоколы · Реализуйте middleware для HTTP-клиента… →