如何通過(guò)go自定義一個(gè)分頁(yè)插件
建議看這個(gè)之前,先看看這個(gè):go操作MySQL · Go語(yǔ)言中文文檔 (topgoer.com)
嗯...也不能叫做分頁(yè)插件,就是一個(gè)分頁(yè)工具類(lèi)。
下載依賴(lài)
go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx
sql_util
我們自定義一個(gè)sql_util,用來(lái)封裝數(shù)據(jù)庫(kù)連接操作。ExecuteCUD()執(zhí)行增刪改操作。ExecuteSelectAll()執(zhí)行查詢(xún)操作。目前沒(méi)有查詢(xún)單個(gè)的,而且查詢(xún)到全部數(shù)據(jù),判斷查詢(xún)數(shù)據(jù)長(zhǎng)度即可。jointSqlStr() : 負(fù)責(zé)拼接sql字符串模版和動(dòng)態(tài)綁定的參數(shù)
package sql
import (
"back-me/main/util"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"strings"
)
const (
username = "root"
password = "123456"
host = "localhost"
port = 3306
dbname = "fdis"
)
var Db *sqlx.DB
func init() {
connectToDatabase()
}
// 連接數(shù)據(jù)庫(kù)
func connectToDatabase() {
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=true&loc=Local", username, password, host, port, dbname)
db, err := sqlx.Open("mysql", dataSourceName)
if err != nil {
util.Log.Error("sql connection error:" + err.Error())
}
// 檢查是否連接成功
err = db.Ping()
if err != nil {
util.Log.Error("sql connection error:" + err.Error())
}
Db = db
}
// 執(zhí)行增刪改操作
func ExecuteCUD(sql string, params ...interface{}) int64 {
sql = jointSqlStr(sql, params...)
conn, err := Db.Begin()
if err != nil {
util.Log.Error("Sql Error:" + err.Error())
return -1
}
r, err := conn.Exec(sql)
if err != nil {
util.Log.Error("Sql Error:" + err.Error())
conn.Rollback()
return -1
}
id, err := r.LastInsertId()
if err != nil {
util.Log.Error("Sql Error:" + err.Error())
conn.Rollback()
return -1
}
conn.Commit()
return id
}
// 執(zhí)行select all
func ExecuteSelectAll(stc interface{}, sql string, params ...interface{}) error {
sql = jointSqlStr(sql, params...)
err := Db.Select(stc, sql)
if err != nil {
util.Log.Error("Sql Select Error:" + err.Error())
return err
}
return nil
}
// 1 5 | 0 5
// 2 5 | 5 5
// 3 5 | 10 5
func jointSqlStr(sqlStr string, args ...interface{}) string {
// 以%s分割
strs := strings.Split(sqlStr, "%s")
if len(strs) == 0 {
return sqlStr
}
newSql := ""
for i, _ := range strs {
newSql += strs[i]
if i != len(strs)-1 {
switch args[i].(type) {
case string:
newSql += args[i].(string)
break
case int:
newSql += fmt.Sprintf("%v", args[i].(int))
break
case uint:
newSql += fmt.Sprintf("%v", args[i].(uint))
break
}
}
}
return newSql
}
page_util
通過(guò),page_util來(lái)封裝分頁(yè)相關(guān)操作。SelectPage(): 傳入我們查詢(xún)的數(shù)據(jù),響應(yīng)一個(gè)封裝好的PageResult結(jié)構(gòu)體。
package page
import (
"back-me/main/model"
"errors"
"reflect"
)
var PageError = errors.New("page or pageSize cannot be < 1")
type Pager struct {
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
func NewPager(page int, pageSize int) (*Pager, error) {
if page < 1 || pageSize < 1 {
return nil, PageError
}
return &Pager{
page,
pageSize,
}, nil
}
func (p *Pager) SelectPage(data interface{}) *model.PageResult {
page := p.Page
pageSize := p.PageSize
page = (page - 1) * pageSize
start := page
end := page + pageSize
l := reflect.ValueOf(data).Elem().Len()
if l-1 < start {
return model.NewPageResult1(nil, 0, page, pageSize)
} else if l-1 >= start && l-1 <= end {
return model.NewPageResult1(subData(data, start, l), l, p.Page, p.PageSize)
} else {
return model.NewPageResult1(subData(data, start, end), l, p.Page, p.PageSize)
}
}
// 包前不包后
func subData(data any, start int, end int) interface{} {
v := reflect.ValueOf(data)
v = v.Elem()
return v.Slice(start, end).Interface()
}
result
分頁(yè)數(shù)據(jù)公共封裝響應(yīng)。
package model
type PageResult struct {
Data any `json:"data"`
Code int `json:"code"`
Mes string `json:"mes"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
func NewPageResult(data any, code int, mes string, total int, page int, pageSize int) *PageResult {
return &PageResult{
data, code, mes, total, page, pageSize,
}
}
// NewPageResult1
func NewPageResult1(data any, total int, page int, pageSize int) *PageResult {
return NewPageResult(data, 200, "ok", total, page, pageSize)
}
測(cè)試
func TestSelectPage(t *testing.T) {
var userVos []vo.User // 查詢(xún)出的數(shù)據(jù),最終封裝到這里面
var sqlStr = "SELECT * FROM `tx_user` WHERE PASSWORD LIKE '%s' LIMIT 0, 2" // %s 就是占位符,被后面?zhèn)魅氲膮?shù)替換
sql.ExecuteSelectAll(&userVos, sqlStr, "%")
// 分頁(yè)
// 0 1
// 2 3
// start <
newPager, err := page.NewPager(1, 2)
if err != nil {
fmt.Println("error:", err.Error())
}
pageResult := newPager.SelectPage(&userVos)
fmt.Println(pageResult)
}總結(jié)
到此這篇關(guān)于如何通過(guò)go自定義一個(gè)分頁(yè)插件的文章就介紹到這了,更多相關(guān)go自定義分頁(yè)插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你吃透Golang中的類(lèi)型轉(zhuǎn)換
Golang是一種強(qiáng)類(lèi)型語(yǔ)言,所以Golang的類(lèi)型轉(zhuǎn)換和C/C++ java等語(yǔ)言的類(lèi)型轉(zhuǎn)換還有點(diǎn)區(qū)別,本文講通過(guò)一些簡(jiǎn)單的示例帶大家深入了解一下Golang中的類(lèi)型轉(zhuǎn)換,需要的可以參考下2023-05-05
Linux操作系統(tǒng)上打包Go項(xiàng)目實(shí)現(xiàn)方式
文章介紹了Go項(xiàng)目依賴(lài)打包的兩種方法:GoModules(管理依賴(lài)并確保一致性)和靜態(tài)鏈接(嵌入依賴(lài)生成獨(dú)立可執(zhí)行文件),需注意cgo配置及系統(tǒng)兼容性,推薦根據(jù)需求選擇合適方式2025-08-08
Golang 空map和未初始化map的注意事項(xiàng)說(shuō)明
這篇文章主要介紹了Golang 空map和未初始化map的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis
分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問(wèn)題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來(lái)自己的創(chuàng)新特性。2021-05-05
Golang中g(shù)oroutine和channel使用介紹深入分析
一次只做一件事情并不是完成任務(wù)最快的方法,一些大的任務(wù)可以拆解成若干個(gè)小任務(wù),goroutine可以讓程序同時(shí)處理幾個(gè)不同的任務(wù),goroutine使用channel來(lái)協(xié)調(diào)它們的工作,channel允許goroutine互相發(fā)送數(shù)據(jù)并同步,這樣一個(gè)goroutine就不會(huì)領(lǐng)先于另一個(gè)goroutine2023-01-01

