Функция `Average()` для вычисления средней успеваемости в Go
Содержимое статьи:
Введение
Рассмотрим сервер, доступный по адресу localhost:8082. Этот сервер возвращает следующие коды ответа:
- 200: Успешная обработка запроса и предоставление оценки студента.
- 404: Студент не найден.
- 500: Ошибка сервера.
Задача Написать функциюAverage(names []string) (int, error), которая: - Вычисляет среднюю успеваемость студентов с именами, хранящимися в массиве
names. - Возвращает ошибку, если невозможно получить оценку хотя бы одного студента.
Решение с использованием WaitGroup ИспользуемWaitGroup, чтобы координировать одновременное получение оценок студентов.
import (
"context"
"errors"
"fmt"
"net/http"
"sync"
)
type Student struct {
Name string
Grade int
Error error
}
// Average вычисляет среднюю успеваемость студентов с именами names.
func Average(names []string) (float64, error) {
// Создаем WaitGroup для ожидания завершения всех потоков.
var wg sync.WaitGroup
wg.Add(len(names))
// Создаем канал для получения результатов.
resultCh := make(chan Student, len(names))
// Запускаем потоки для получения оценок.
for _, name := range names {
go func(name string) {
defer wg.Done()
grade, err := getGrade(name)
resultCh <- Student{Name: name, Grade: grade, Error: err}
}(name)
}
// Ждем завершения всех потоков.
wg.Wait()
close(resultCh)
// Суммируем оценки и количество студентов.
var sumGrades, numStudents int
for student := range resultCh {
if student.Error != nil {
return 0, fmt.Errorf("не удалось получить оценку для студента %s: %v", student.Name, student.Error)
}
sumGrades += student.Grade
numStudents++
}
if numStudents == 0 {
return 0, errors.New("нет студентов")
}
// Вычисляем среднюю успеваемость.
average := float64(sumGrades) / float64(numStudents)
return average, nil
}
// getGrade имитирует получение оценки студента с сервера.
func getGrade(name string) (int, error) {
url := fmt.Sprintf("http://localhost:8082/mark?name=%s", name)
resp, err := http.Get(url)
if err != nil {
return 0, fmt.Errorf("ошибка запроса: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode == 200 {
var grade int
if _, err := fmt.Fscan(resp.Body, &grade); err != nil {
return 0, fmt.Errorf("не удалось прочитать оценку: %v", err)
}
return grade, nil
} else if resp.StatusCode == 404 {
return 0, errors.New("студент не найден")
} else {
return 0, fmt.Errorf("ошибка сервера: %v", resp.StatusCode)
}
}
Английский видеочат для изучения языка
Биткоин доллар курс
Чат рулетка 2026: Эффективное распределение
Чат-рулетка без регистрации и ограничений: свободное общение
Чат с Аней: Настоящее общение
Готовые этикетки для магазинов
Инженерные системы в Крыму и Севастополе
ИП или ООО: сравнение налоговых нагрузок?
Как правильно провести электропроводку в новом доме
Как правильно выбрать дверь для квартиры: советы экспертов
Лайфхаки по использованию устройства для смешения раствора «Микс-500»
Ошибки при монтаже окна из ПВХ: как избежать и исправить
Ошибки при монтаже сантехники: причины и решения
Ошибки при монтаже системы водоснабжения: как избежать
Продвинутые техники заработка онлайн
Ремонт квартир с отоплением
Roblox: лучшие сервера
Русский Онлайн Чат
Сколько платят SEO-экспертам
Современное продвижение сайтов: от SEO до ИИ
Сравнение автошкол Курска
Сравнение строительных механизмов: Каткомат против СтройКомбайн
Сравнение теплоизоляторов: Стройпласт против Синтез
Трубная продукция для трубопроводных систем с повышенной надежностью
Утепление помещений в Тверской области
Vdsina: Творческий потенциал
Видео чат 18+ встречи
Видеообращения с другими
Знакомства в интернете без романтики