系列文章
【golang学习之旅】报错:a declared but not used
【golang学习之旅】Go 的基本数据类型
【golang学习之旅】深入理解字符串string数据类型
【golang学习之旅】go mod tidy
case
今天写了一个向数据库表中插入一条记录的函数,里面有一行代码如下:
package test
func (...) ...{
...
result := a.db.Table(TableName).Create(record)
...
}
在这行代码中,a.db
代表一个已经初始化好的GORM数据库连接实例,Table
方法用于指定要操作的数据库表,而Create
方法则是用来向该表中插入一条新的记录。record是我们想要插入的记录的结构体类型的一个实例。
乍一眼看是不是没有问题,但是当我对这个函数进行测试就会出现以下panic:
因为我对这个panic做了recover,所以能够接住这个panic从而让程序正常结束:
解决
这个panic提示我们可能是传地址的时候传了值导致的。
我查了一些资料发现问题在于,GORM的Create
方法期望接收一个指针类型的参数,这个指针指向要插入到数据库中的结构体实例。当直接传入record时,实际上是传递了record的一个副本,而不是它本身的引用。所以我们应该传入&record
:
result := a.db.Table(TableName).Create(&record)
这样就解决啦