记一次goer新手的using unaddressable value错误

go测试的时候,报错;

go test 报错panic: reflect: reflect.Value.Set using unaddressable value [recovered]。

解决办法:一般出现 using unaddressable value 错误,表示传递的指针值不对,比如需要传递指针地址的,但是传了值。当时就就预感应该是db在find的时候传了非指针,验证之后果然是。

所以,总结就是:gorm里面更新的时候,可以不传指针(如果要用到返回的主键,还是要传指针的),但是查询的时候一定要传,哪怕是slice或者map类型。

PS: 用updates更新时,不能传map的引用!

比如:

func UpdateExperiment(Id int64, update map[string]interface{}) error {
	conn, err := getDBConn(ctx, true)
	if err != nil {
		return err
	}
	db := conn.Table(ExperimentTable).
		Where("id = ?",Id).
		Updates(&update) // 这里传map的引用, 不 work!!

	if db.Error != nil {
		logs.CtxError(ctx, "UpdateExperiment db error:%s", db.Error)
		return db.Error
	}
	return nil
}

应该直接传递update,而不是&update!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值