Go · 53 строк
Обработчик отдаёт ленту постов друзей, новые сверху. Клиент листает её курсором: before — время последнего показанного поста, limit — размер страницы, приложение шлёт 30.
У активного пользователя 300–1 000 друзей, у друга в среднем 2 000 постов за всё время. Пул соединений — SetMaxOpenConns(50), обработчик держит 3 000 запросов в секунду на под. Отметьте строки с ошибками.
В работе: Вкладка «Друзья» в ленте: первый экран после открытия приложения.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных VK: лента и друзья. Условие пересказано своими словами.
Давали на собеседовании?
package feedimport ("database/sql""encoding/json""net/http""sort""strconv")type Post struct {ID int64 `json:"id"`AuthorID int64 `json:"author_id"`Author string `json:"author"`Text string `json:"text"`CreatedAt int64 `json:"created_at"`Likes int `json:"likes"`}type Service struct {db *sql.DB}func (s *Service) Feed(w http.ResponseWriter, r *http.Request) {userID, _ := strconv.ParseInt(r.URL.Query().Get("user_id"), 10, 64)limit, _ := strconv.Atoi(r.URL.Query().Get("limit"))before, _ := strconv.ParseInt(r.URL.Query().Get("before"), 10, 64)rows, err := s.db.QueryContext(r.Context(),"SELECT p.id, p.author_id, p.text, p.created_at, p.likes FROM posts p "+"JOIN friends f ON f.friend_id = p.author_id "+"WHERE f.user_id = $1 AND p.created_at < $2",userID, before)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer rows.Close()var posts []Postfor rows.Next() {var p Postrows.Scan(&p.ID, &p.AuthorID, &p.Text, &p.CreatedAt, &p.Likes)s.db.QueryRowContext(r.Context(), "SELECT name FROM users WHERE id = $1", p.AuthorID).Scan(&p.Author)posts = append(posts, p)}sort.Slice(posts, func(i, j int) bool { return posts[i].CreatedAt > posts[j].CreatedAt })if len(posts) > limit {posts = posts[:limit]}json.NewEncoder(w).Encode(posts)}