1. 默认值
何为默认值尼。
例如对于整型int来说,0就是它的默认值。
例如对于字符串string来说,“”就是它的默认值。
例如对于布尔bool来说,false就是它的默认值。
2. gorm默认值里的一些坑点
2.1 查询单条语句
假设你传入的User{ID:0}, 这样子是不会按照 where id=0来进行查询的。
如下图的官方文档带有一点点误导,没有说清楚这个问题。
解决方法: 如果真的就要根据id=0来进行查询数据。
那么db.First(&user, "id = ?", 0) 这样子来进行查询
2.2 更新某个字段
例如我有一个字段是int类型,然后当前是1值, 我希望更新为0值。
假设我使用如下的方式进行更新,是不会更新成功的。
db.Model(&user).Updates(User{ID:0,Name:"hehe"})
解决方案: db.Mdel(&user).Updates(map[string]interface{}{"id": 0})
3. 分析
3.1 使用指针类型
其实主要就是在更新一个数据struct 给到gorm的时候, orm框架没办法去区分你这个字段究竟是没有赋值,还是人工赋值为默认值。
除了上面的解决方案,其实还有另外一种。
就是 使用*int类型定义整型, 也就是
type User struct {
ID *int
}
因为这样子就是指针, 指针的默认是是nill。
3.2 避免默认值的出现在业务含义里
例如 我们会这样子定义业务状态
StatusOnline int = 0 << iota
StatusOffline
StatusUnknow
这样子就从0开始默认递增。
应该改成如下
StatusOnline int =1 << iota
4. 总结
由于官方文档的简洁,所以可能初用gorm的同学来说容易采坑。这里简单说明一下,这块的经验,希望对你的go编程中能有作用