注意:通过tag定义字段的默认值,在创建记录时候生成的 SQL 语句会排除没有值或值为 零值 的字段。 在将记录插入到数据库后,Gorm会从数据库加载那些字段的默认值。

举个例子:

var user = User{Name: "", Age: 99}
db.Create(&user)
INSERT INTO users("age") values('99');Name小王子
0""false零值Scanner/Valuer

使用指针方式实现零值存入数据库

// 使用指针
type User struct {
ID int64
Name *string `gorm:"default:'小王子'"`
Age int64
}
user := User{Name: new(string), Age: 18))}
db.Create(&user) // 此时数据库中该条记录name字段的值就是''

使用Scanner/Valuer接口方式实现零值存入数据库

// 使用 Scanner/Valuer
type User struct {
ID int64
Name sql.NullString `gorm:"default:'小王子'"` // sql.NullString 实现了Scanner/Valuer接口,是一个结构体
Age int64
}
user := User{Name: sql.NullString{"", true}, Age:18}//设置为ture时,数据库就知道存入前面的string字段"",如果设置为false就用默认值
db.Create(&user) // 此时数据库中该条记录name字段的值就是''

​ 有的结构体用到指针类型就是因为这个原因,该字段可能传入零值为了防止被存为默认值就用指针或者方法2