公司动态

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

📅 2026/7/24 8:49:24
go 整数的默认值0不传也是查询的解决方法
Go 中整数字段的零值是0这在数据库查询时确实是个常见问题当你想不传就不查询时0会被当成有效条件传入导致查询结果不符合预期。以下是几种常见的解决方法传-1if self.Query.TrainStatus 0 userId 0 { if self.Query.TrainStatus 0 { // 未开始要么 musp 不存在要么 musp.train_status0 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表示未设置gotype 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适合数据库交互场景gotype 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可以用反射封装gotype 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表示全部/不限gotype 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条件gofunc 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值