当前位置: 首页 > news >正文

go 整数的默认值0不传也是查询的解决方法

Go 中整数字段的零值是0,这在数据库查询时确实是个常见问题:当你想"不传就不查询"时,0会被当成有效条件传入,导致查询结果不符合预期。

以下是几种常见的解决方法:

传-1

if self.Query.TrainStatus >= 0 && userId > 0 { if self.Query.TrainStatus == 0 { // 未开始:要么 musp 不存在,要么 musp.train_status=0 joinQuery.WithWhere("(musp.train_status IS NULL OR musp.train_status = 0)") } else { // 其他状态:必须 musp 存在且 musp.train_status 等于指定值 joinQuery.WithWhere("musp.train_status = ?", int(self.Query.TrainStatus)) } }

1. 使用指针类型*int

最通用的做法,用nil表示"未设置":

go

type QueryParams struct { Status *int `form:"status"` // 不传时为 nil,传 0 时 &0 } func query(db *gorm.DB, params QueryParams) *gorm.DB { if params.Status != nil { db = db.Where("status = ?", *params.Status) } return db }

优点:语义清晰,能区分"未传"和"传了 0"。
缺点:使用稍繁琐,需要解引用。


2. 使用sql.NullInt64/sql.NullInt32

适合数据库交互场景:

go

type QueryParams struct { Status sql.NullInt64 `form:"status"` } func query(db *gorm.DB, params QueryParams) *gorm.DB { if params.Status.Valid { db = db.Where("status = ?", params.Status.Int64) } return db }

优点:与 SQL 生态兼容,明确表达"有值/无值"。


3. 配合自定义 Tag + 反射的通用方案

如果字段很多,不想每个都写if,可以用反射封装:

go

type QueryParams struct { Status int `form:"status" zero:"ignore"` // 自定义 tag Age int `form:"age" zero:"ignore"` } func BuildQuery(db *gorm.DB, model interface{}) *gorm.DB { // 反射遍历字段,遇到 zero:"ignore" 且为零值则跳过 // ... }

4. 用特殊值约定(不推荐但简单)

比如用-1表示"全部/不限":

go

type QueryParams struct { Status int `form:"status" binding:"gte=-1"` } func query(db *gorm.DB, status int) *gorm.DB { if status != -1 { db = db.Where("status = ?", status) } return db }

缺点:语义不直观,容易踩坑。


5. 如果用的是 GORM,配合map条件

go

func query(db *gorm.DB, status int) *gorm.DB { cond := map[string]interface{}{} if status != 0 { // 或根据业务判断 cond["status"] = status } return db.Where(cond) }

推荐方案

表格

场景推荐
简单查询、字段少指针*int
大量查询条件、通用封装反射 + 自定义 tag
与数据库模型强绑定sql.NullInt64

你目前用的是哪个框架(Gin + GORM?还是标准库)?我可以给更贴合你项目的代码。

最优解,尽量不取0值!

http://www.jsqmd.com/news/1253345/

相关文章:

  • 高价回收黄金防坑指南,广州各区实体店铺地址罗列,出门变现先收藏 - 奢侈品回收评测
  • 人工智能大模型技术解析与实战指南
  • 上门取件旧衣服回收:2026年最高0.8元/公斤,爱宝拉一键预约包邮免费上门 - 快递物流资讯
  • LM93硬件监控芯片寄存器解析与SMBus通信实战指南
  • 深入解析MSP430 MPY32硬件乘法器:原理、模式与嵌入式DSP实战
  • 前端输入框焦点管理:解决回车键失焦的实战方案
  • 苏州长期零申报企业如何降低税务预警风险?
  • 精密时钟调理器设计:从PLL原理到PCB布局的工程实践
  • C++ Lambda表达式:从核心语法到现代编程实战全解析
  • 大模型后训练方法论:从原理到实践的SOLID框架
  • 智能诊断技术MSO算法:VMD-CNN-BiLSTM在工业预测性维护中的应用
  • C++实现ADFGX密码破解:模拟退火算法与古典密码分析实战
  • 告别数字囤积:从网盘收藏到高效知识管理的实用指南
  • 基于普通摄像头的人体无感定位技术解析
  • 空间智能交互框架:解决跨平台设备通信与协议适配难题
  • 离线AI核心技术解析与工业部署实战
  • AI论文写作工具实测:9款神器提升学术效率
  • 达州市黄金首饰回收,璟安黄金回收免费估价,即刻打款 - 新芸鼎珠宝首饰
  • LVDS接收器跨界应用:解决PECL/CMOS信号转换与时钟整形难题
  • 单图生成3D模型:深度学习颠覆传统建模流程
  • AnimateDiff Forge插件安装与优化全指南
  • 投资黄金去哪回收?宣城市璟安黄金回收专业靠谱 - 新芸鼎珠宝首饰
  • 论文降AI率工具对比:千笔与文途的技术原理与应用
  • AI音乐软件哪个好 2026国产写歌工具实测对
  • AI Agent如何变革软件开发项目管理
  • Function Calling与ReAct核心技术解析与应用指南
  • 大模型后训练:提升安全性与领域适配的关键技术
  • 2026秦皇岛装修公司推荐这3家:实用避坑指南帮你选到靠谱家装 - 装企精灵GEO
  • LLM Agent核心模块:记忆、工具调用与规划技术解析
  • AI技术栈解析:大模型、多模态与智能体实践