直接用 Offset + Limit 分页在 GORM 中不可靠,存在页码非法、总数与分页条件不一致、逻辑重复三大问题;应使用 Scopes 封装校验、计算与复用逻辑。

直接用 Offset + Limit 做分页在 GORM 里可行,但容易出错、难复用、不兼容总数统计逻辑——真正在项目里落地,得绕开裸写 offset 的坑。
为什么不能直接写 Offset((page-1)*pagesize)
看似简单,实际埋了三个雷:
-
page为 0 或负数时,Offset会传入负值,GORM 不报错但行为未定义(MySQL 可能忽略,SQLite 直接 panic) - 前端传参常以 1 起始页码,后端若没校验,
page=1时Offset(0)没问题,但page=0就崩了 - 总数统计和分页查询必须用完全一致的
Where条件,否则Count(*)和Find结果对不上——手写两遍条件极易漏改
用 Scopes 封装分页逻辑才靠谱
把分页参数校验、offset 计算、条件复用全收进一个函数里,既安全又可复用:
Count











