Go語言結(jié)合Gin框架快速實(shí)現(xiàn)分頁查詢接口
在開發(fā) Web 應(yīng)用時(shí),分頁查詢 是非常常見的需求。比如文章列表、用戶管理后臺(tái)、商品展示頁,都需要分頁展示數(shù)據(jù)。
在 Go 語言中,我們可以結(jié)合 GORM + Gin 框架,快速實(shí)現(xiàn)分頁查詢接口。本文將帶你一步步實(shí)現(xiàn)一個(gè) 用戶列表的分頁接口。
一、環(huán)境準(zhǔn)備
依賴庫安裝:
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql go get -u github.com/gin-gonic/gin
數(shù)據(jù)庫使用 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ù)庫連接失敗:", err) } // 自動(dòng)遷移 _ = db.AutoMigrate(&User{}) }
三、實(shí)現(xiàn)分頁查詢接口
分頁查詢的核心就是 計(jì)算 offset 和 limit:
page
當(dāng)前頁(從 1 開始)pageSize
每頁數(shù)量offset = (page - 1) * pageSize
代碼實(shí)現(xiàn):
// 分頁查詢接口 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) // 分頁查詢 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è) 分頁查詢接口:
- 支持動(dòng)態(tài)
page
和pageSize
參數(shù) - 返回總數(shù)
total
,便于前端計(jì)算總頁數(shù) - 返回當(dāng)前頁數(shù)據(jù)
優(yōu)化點(diǎn):
1. 封裝通用分頁函數(shù),避免每個(gè)接口都重復(fù)寫分頁邏輯。
2. 加入排序功能,如 orderBy=age desc
。
3. 加入搜索過濾,例如按用戶名查詢。
這樣,我們就能快速實(shí)現(xiàn)一個(gè)完整的 分頁 + 搜索 + 排序 的列表接口。
到此這篇關(guān)于Go語言結(jié)合Gin框架快速實(shí)現(xiàn)分頁查詢接口的文章就介紹到這了,更多相關(guān)Go語言分頁查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?+?Gin實(shí)現(xiàn)雙Token管理員登錄的示例代碼
本文主要介紹了Go?+?Gin實(shí)現(xiàn)雙Token管理員登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07Go 簡(jiǎn)單實(shí)現(xiàn)多租戶數(shù)據(jù)庫隔離
本文主要介紹了Go 簡(jiǎn)單實(shí)現(xiàn)多租戶數(shù)據(jù)庫隔離,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Go語言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語言中結(jié)構(gòu)體和方法的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下2022-04-04Go語言常見錯(cuò)誤之將接口定義在實(shí)現(xiàn)方
在Go中,接口起到一個(gè)十分關(guān)鍵的角色,它們提供了一種方式來定義對(duì)象的行為,而不需要知道對(duì)象的具體實(shí)現(xiàn),一個(gè)常見的錯(cuò)誤是在實(shí)現(xiàn)方而不是使用方定義接口,本文將詳細(xì)探討為何這樣做是一個(gè)錯(cuò)誤,以及如何避免它2024-01-01Go實(shí)現(xiàn)一個(gè)輕量級(jí)并發(fā)任務(wù)調(diào)度器(支持限速)
本文主要介紹了Go實(shí)現(xiàn)一個(gè)輕量級(jí)并發(fā)任務(wù)調(diào)度器(支持限速),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04golang 40行代碼實(shí)現(xiàn)通用協(xié)程池
golang協(xié)程機(jī)制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當(dāng)限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實(shí)現(xiàn)通用協(xié)程池,需要的朋友可以參考下2018-08-08