> Как устроена пагинация в Go проектах (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: sferaplatform.ru

Стек: Go

> Пример ответа

В Go-проектах пагинация обычно реализуется через параметры запроса (query parameters) и смещение/лимит (offset/limit) или курсорный подход. Рассмотрим оба варианта.

1. Offset/Limit пагинация - самый распространенный способ. Параметры передаются в URL: ?page=2&limit=20. В коде это выглядит так:

GO
type 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 users
ORDER BY id
LIMIT $1 OFFSET $2`, pagination.Limit, pagination.Offset())

Для подсчета общего количества записей обычно делают отдельный COUNT(*) запрос, чтобы вернуть клиенту total и totalPages.

2. Курсорная пагинация - более производительная для больших таблиц. Использует уникальный идентификатор (например, ID или timestamp) вместо номера страницы:

GO
type CursorPagination struct {
Cursor int64 `form:"cursor"` // ID последней записи с предыдущей страницы
Limit int `form:"limit" default:"10"`
}
// SQL-запрос
rows, err := db.Query(ctx, `
SELECT * FROM users
WHERE id > $1
ORDER BY id
LIMIT $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 }.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью