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种情况
- 创建了一条字段齐全的数据
- 创建了缺少age的数据
- 创建了age是0的数据
- 创建了address为空的数据
4、执行结果
问题出现了,第二条是缺少age才显示19,第三条故意写成0的,为什么还要显示19呢?第四条如果是特意写成空,那么显示为“无家可归”,这样是不是有点事与愿违了吗?为什么会出现这种情况呢?怎么解决这个问题呢?
如果字段中声明了默认值,等零值(如0、””、false)是不能保存到数据库。
解决这个问题,可以使用指针类型或 Scanner/Valuer 来避免这个问题。
采用指针类型解决
定义结构体的时候采用指针类型
传递参数的时候,也使用指针类型
执行结果
可以看到,通过指针类型是可以避免等零值的问题
采用 Scanner/Valuer 解决
(1)设置结构体字段的类型
(2)传递参数的时候,也使用 Scanner/Valuer
(3)执行结果