Gobuffalo中使用pop.Connection#ValidateAndCreate报错求助
解决Gobuffalo Pop
ValidateAndCreate 出现 reflect: call of reflect.Value.Elem on struct Value 错误 嘿,这个问题我之前踩过一模一样的坑,一眼就知道问题出在哪了——你给ValidateAndCreate传的是结构体值,但Pop的这个方法要求传入的是结构体指针!
为什么会触发这个错误?
Pop的ORM方法(像Create、ValidateAndCreate这类)内部需要修改传入的模型对象,比如自动填充主键、创建时间这类字段,所以必须接收指针类型的参数。如果传值类型的话,方法拿到的只是一个对象副本,而且反射操作时会尝试对结构体值调用Elem()(这个方法只能用在指针类型的反射值上),直接就触发了你看到的反射错误。
修复后的代码
只需要在循环里把item改成它的指针&item就行,修改后的完整代码片段如下:
purchaseOrder.Items = models.OrderItems{} // ... fill purchaseOrder.Items ... for _, item := range purchaseOrder.Items { verrs, err := tx.ValidateAndCreate(&item) // 此处改为传递指针 if err != nil { return errors.WithStack(err) } if verrs != nil { // show error } }
修改后Pop就能正确处理你的模型对象,不会再触发反射相关的错误了。另外可以确认下你的OrderItems结构体已经正确配置了Pop的标签(比如db:"..."),不过这个错误本身和标签无关,核心问题就是指针传递的问题。
内容的提问来源于stack exchange,提问作者codhur_jones
相关产品推荐
相关产品推荐

