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

4. Счётчик просмотров объявлений

Лёгкая

Go · 28 строк

Каждый показ карточки объявления дёргает HandleView, продавец смотрит цифры через HandleStats. net/http обслуживает каждый запрос в своей горутине.

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

В работе: Счётчик «просмотров сегодня» в карточке объявления.

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

Источник: на задачах Авито: статистика объявлений. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package views
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "strconv"
  6. )
  7. var counts = map[int64]int{} // id объявления → просмотры
  8. func HandleView(w http.ResponseWriter, r *http.Request) {
  9. id, err := strconv.ParseInt(r.URL.Query().Get("item"), 10, 64)
  10. if err != nil {
  11. http.Error(w, "bad item", http.StatusBadRequest)
  12. return
  13. }
  14. counts[id]++
  15. w.WriteHeader(http.StatusNoContent)
  16. }
  17. func HandleStats(w http.ResponseWriter, r *http.Request) {
  18. id, err := strconv.ParseInt(r.URL.Query().Get("item"), 10, 64)
  19. if err != nil {
  20. http.Error(w, "bad item", http.StatusBadRequest)
  21. return
  22. }
  23. json.NewEncoder(w).Encode(map[string]int{"views": counts[id]})
  24. }