> Как устроена пагинация в Go проектах (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: sferaplatform.ru
Стек: Go
> Пример ответа
В Go-проектах пагинация обычно реализуется через параметры запроса (query parameters) и смещение/лимит (offset/limit) или курсорный подход. Рассмотрим оба варианта.
1. Offset/Limit пагинация - самый распространенный способ. Параметры передаются в URL: ?page=2&limit=20. В коде это выглядит так:
GOtype Pagination struct {Page int `form:"page" default:"1"`Limit int `form:"limit" default:"10"`}func (p *Pagination) Offset() int {return (p.Page - 1) * p.Limit}// Использование в SQL-запросеrows, err := db.Query(ctx, `SELECT * FROM usersORDER BY idLIMIT $1 OFFSET $2`, pagination.Limit, pagination.Offset())
Для подсчета общего количества записей обычно делают отдельный COUNT(*) запрос, чтобы вернуть клиенту total и totalPages.
2. Курсорная пагинация - более производительная для больших таблиц. Использует уникальный идентификатор (например, ID или timestamp) вместо номера страницы:
GOtype CursorPagination struct {Cursor int64 `form:"cursor"` // ID последней записи с предыдущей страницыLimit int `form:"limit" default:"10"`}// SQL-запросrows, err := db.Query(ctx, `SELECT * FROM usersWHERE id > $1ORDER BY idLIMIT $2`, pagination.Cursor, pagination.Limit)
В ответе возвращается nextCursor (ID последней записи) и hasMore (если записей больше, чем limit).
Рекомендации:
-
Для простых CRUD используйте offset/limit - он интуитивно понятен.
-
Для высоконагруженных систем или больших таблиц (миллионы записей) предпочтительна курсорная пагинация - она избегает проблем с производительностью при больших OFFSET.
-
Всегда валидируйте параметры: ограничивайте максимальный
limit(например, 100), чтобы избежать DoS-атак. -
В REST API принято возвращать метаданные:
{ data: [...], pagination: { page, limit, total, totalPages } }или{ data: [...], nextCursor, hasMore }.
> Похожие задачи по backend
Почему запрос с индексами может тормозить и как это решать
Как бороться с большими объемами данных в запросах, например шардирование
Как реализовать эффективную пагинацию с курсорами и индексами
Напиши функцию на Go, которая принимает слайс каналов int и возвращает канал с суммами чисел из каждого канала
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью