分页与筛选功能可通过定义Pagination和Filter结构体实现,解析URL参数并结合GORM动态构建SQL查询条件,提升接口可用性与性能。

在开发 Golang 的 RESTful 接口时,分页与筛选功能是大多数数据查询接口的标配。合理设计这些功能,不仅能提升接口的可用性,还能减轻服务端和数据库的压力。下面介绍如何在 Go 中实现通用、可扩展的分页与筛选机制。
分页参数解析
通常客户端通过 URL 查询参数传递分页信息,如 page 和 limit,或使用 offset 与 limit 模式。
定义一个结构体来接收分页参数:
type Pagination struct { Page int `json:"page"` Limit int `json:"limit"` Offset int `json:"-"`}func (p Pagination) SetOffset() {p.Offset = (p.Page - 1) p.Limit}
在 HTTP 处理函数中解析查询参数:
立即学习“go语言免费学习笔记(深入)”;
func parsePagination(r *http.Request) Pagination { page := getIntQuery(r, "page", 1) limit := getIntQuery(r, "limit", 10) if limit > 100 { limit = 100 // 限制最大每页数量 } pag := Pagination{Page: page, Limit: limit} pag.SetOffset() return pag}func getIntQuery(r *http.Request, key string, defaultValue int) int {str := r.URL.Query().Get(key)if str == "" {return defaultValue}if val, err := strconv.Atoi(str); err == nil {return val}return defaultValue}
筛选条件处理
筛选通常基于字段如状态、时间范围、关键词搜索等。可以通过结构体绑定查询参数,动态构建数据库查询条件。
type Filter struct { Status string `json:"status"` Keyword string `json:"keyword"` StartAt string `json:"start_at"` EndAt string `json:"end_at"`}
根据 Filter 结构体生成 SQL 查询条件(以 GORM 为例):
func BuildQuery(db *gorm.DB, filter Filter) *gorm.DB { if filter.Status != "" { db = db.Where("status = ?", filter.Status) } if filter.Keyword != "" { db = db.Where("name LIKE ? OR description LIKE ?", "%"+filter.Keyword+"%", "%"+filter.Keyword+"%") } if filter.StartAt != "" { db = db.Where("created_at >= ?", filter.StartAt) } if filter.EndAt != "" { db = db.Where("created_at <= ?", filter.EndAt) } return db}
组合分页与筛选返回响应
将分页和筛选结合,在 Handler 中调用数据库查询,并返回带总数的响应:
func GetItems(w http.ResponseWriter, r *http.Request) { pagination := parsePagination(r) var filter Filter// 解析筛选参数filter.Status = r.URL.Query().Get("status")filter.Keyword = r.URL.Query().Get("keyword")filter.StartAt = r.URL.Query().Get("start_at")filter.EndAt = r.URL.Query().Get("end_at")db := database.DB.Model(&Item{})db = BuildQuery(db, filter)var total int64db.Count(&total)var items []Itemdb.Offset(pagination.Offset).Limit(pagination.Limit).Find(&items)response := map[string]interface{}{ "items": items, "total": total, "page": pagination.Page, "limit": pagination.Limit,}json.NewEncoder(w).Encode(response)
}
基本上就这些。通过结构化分页和筛选参数,配合 ORM 动态查询,可以快速构建灵活、安全的 REST 接口。注意对输入做校验,避免 SQL 注入或性能问题。不复杂但容易忽略的是默认值控制和上限限制,这对系统稳定性很重要。
以上就是Golang RESTful接口分页与筛选功能开发的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410700.html
微信扫一扫
支付宝扫一扫