七叶笔记 » golang编程 » golang web从入门到精通 gorm中当等零值遇到默认值怎么办?

golang web从入门到精通 gorm中当等零值遇到默认值怎么办?

golang简介

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

go语言优点

go是非常年轻的一门语言,“兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性”,具备强大的标准库,内置垃圾回收机制,属于静态类型语言,因此具备编译检查和编码规范,特别是并发功能实现简单,但功能强大,可使用goroutine和channel轻松实现高并发。

为什么要用Golang ORM库(摘自官网文档)

(1)全功能ORM

(2)关联(拥有一个,拥有多个,属于,多对多,多态,单表继承)

(3)Create,Save,Update,Delete,Find中钩子方法

(4)支持Preload、Joins的预加载

(5)事务,嵌套事务,SavePoint,RollbackTotoSavedPoint

(6)Context、预编译模式、DryRun模式

(7)批量插入,FindInBatches,Find/CreatewithMap,使用SQL表达式、ContextValuer进行CRUD

(8)SQL构建器,Upsert,锁,Optimizer/Index/CommentHint,命名参数,子查询

(9)复合主键,索引,约束

(10)自动迁移

(11)自定义Logger

(12)灵活的可扩展插件API:DatabaseResolver(多数据库,读写分离)、Prometheus…

(13)每个特性都经过了测试的重重考验

(14)开发者友好

gorm中当等零值遇到默认值怎么办?

我做了个例子来触发这个问题。

1、定义一个数据表对应的结构体

定义一个数据表对应的结构体

2、创建函数并返回影响行数和错误

创建函数并返回影响行数和错误

3、创建单元测试函数

创建单元测试函数

分别存在4种情况

  1. 创建了一条字段齐全的数据
  2. 创建了缺少age的数据
  3. 创建了age是0的数据
  4. 创建了address为空的数据

4、执行结果


问题出现了,第二条是缺少age才显示19,第三条故意写成0的,为什么还要显示19呢?第四条如果是特意写成空,那么显示为“无家可归”,这样是不是有点事与愿违了吗?为什么会出现这种情况呢?怎么解决这个问题呢?

如果字段中声明了默认值,等零值(如0、””、false)是不能保存到数据库。

解决这个问题,可以使用指针类型或 Scanner/Valuer 来避免这个问题。

采用指针类型解决

定义结构体的时候采用指针类型

传递参数的时候,也使用指针类型

执行结果

可以看到,通过指针类型是可以避免等零值的问题

采用 Scanner/Valuer 解决

(1)设置结构体字段的类型

设置结构体字段的类型

(2)传递参数的时候,也使用 Scanner/Valuer

传递参数的时候,也使用Scanner/Valuer

(3)执行结果

执行结果

相关文章