Go語(yǔ)言結(jié)合Gin框架快速實(shí)現(xiàn)分頁(yè)查詢接口
在開發(fā) Web 應(yīng)用時(shí),分頁(yè)查詢 是非常常見的需求。比如文章列表、用戶管理后臺(tái)、商品展示頁(yè),都需要分頁(yè)展示數(shù)據(jù)。
在 Go 語(yǔ)言中,我們可以結(jié)合 GORM + Gin 框架,快速實(shí)現(xiàn)分頁(yè)查詢接口。本文將帶你一步步實(shí)現(xiàn)一個(gè) 用戶列表的分頁(yè)接口。
一、環(huán)境準(zhǔn)備
依賴庫(kù)安裝:
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql go get -u github.com/gin-gonic/gin
數(shù)據(jù)庫(kù)使用 MySQL(也可換 SQLite、Postgres)。
二、定義用戶模型
我們以 User 模型作為例子:
package main
import (
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
"net/http"
)
// User 用戶模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
Age int
}
var db *gorm.DB
func initDB() {
dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("數(shù)據(jù)庫(kù)連接失敗:", err)
}
// 自動(dòng)遷移
_ = db.AutoMigrate(&User{})
}
三、實(shí)現(xiàn)分頁(yè)查詢接口
分頁(yè)查詢的核心就是 計(jì)算 offset 和 limit:
page當(dāng)前頁(yè)(從 1 開始)pageSize每頁(yè)數(shù)量offset = (page - 1) * pageSize
代碼實(shí)現(xiàn):
// 分頁(yè)查詢接口
func getUsers(c *gin.Context) {
// 獲取查詢參數(shù),默認(rèn) page=1, pageSize=10
page := c.DefaultQuery("page", "1")
pageSize := c.DefaultQuery("pageSize", "10")
var (
users []User
total int64
)
// 轉(zhuǎn)換為 int
var p, ps int
fmt.Sscanf(page, "%d", &p)
fmt.Sscanf(pageSize, "%d", &ps)
if p < 1 {
p = 1
}
if ps < 1 {
ps = 10
}
// 查詢總數(shù)
db.Model(&User{}).Count(&total)
// 分頁(yè)查詢
db.Offset((p - 1) * ps).Limit(ps).Find(&users)
// 返回 JSON
c.JSON(http.StatusOK, gin.H{
"page": p,
"pageSize": ps,
"total": total,
"data": users,
})
}
在 main() 中注冊(cè)路由:
func main() {
initDB()
r := gin.Default()
r.GET("/users", getUsers)
r.Run(":8080")
}
四、接口調(diào)用效果
請(qǐng)求:
curl "http://localhost:8080/users?page=2&pageSize=5"
返回:
{
"page": 2,
"pageSize": 5,
"total": 23,
"data": [
{"ID":6,"Name":"Alice","Email":"alice@test.com","Age":22},
{"ID":7,"Name":"Bob","Email":"bob@test.com","Age":25},
{"ID":8,"Name":"Tom","Email":"tom@test.com","Age":20},
{"ID":9,"Name":"Jerry","Email":"jerry@test.com","Age":30},
{"ID":10,"Name":"Lucy","Email":"lucy@test.com","Age":19}
]
}
五、總結(jié)與優(yōu)化
本案例實(shí)現(xiàn)了一個(gè) 分頁(yè)查詢接口:
- 支持動(dòng)態(tài)
page和pageSize參數(shù) - 返回總數(shù)
total,便于前端計(jì)算總頁(yè)數(shù) - 返回當(dāng)前頁(yè)數(shù)據(jù)
優(yōu)化點(diǎn):
1. 封裝通用分頁(yè)函數(shù),避免每個(gè)接口都重復(fù)寫分頁(yè)邏輯。
2. 加入排序功能,如 orderBy=age desc。
3. 加入搜索過(guò)濾,例如按用戶名查詢。
這樣,我們就能快速實(shí)現(xiàn)一個(gè)完整的 分頁(yè) + 搜索 + 排序 的列表接口。
到此這篇關(guān)于Go語(yǔ)言結(jié)合Gin框架快速實(shí)現(xiàn)分頁(yè)查詢接口的文章就介紹到這了,更多相關(guān)Go語(yǔ)言分頁(yè)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼
本文主要介紹了go語(yǔ)言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
詳解如何在Golang中監(jiān)聽多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
Go語(yǔ)言const&iota的實(shí)現(xiàn)示例
本文主要介紹了Go語(yǔ)言const&iota的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
使用go實(shí)現(xiàn)簡(jiǎn)易比特幣區(qū)塊鏈公鏈功能
這篇文章主要介紹了使用go實(shí)現(xiàn)簡(jiǎn)易比特幣區(qū)塊鏈公鏈功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Go語(yǔ)言學(xué)習(xí)之context包的用法詳解
日常Go開發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會(huì)有探索的欲望,那么就跟著本篇文章,一起來(lái)學(xué)習(xí)吧2022-10-10

