golang gorm查询报错,返回值参数一个是,切片指针类型的结构体和指针类型结构体
第一个函数返回的是切片类型的结构体,结构体都是指针类型
第二个函数返回的是结构体指针类型。
两个函数都定义返回变量为什么第一个函数Find(&xxx)就可以,
为什么第二个函数需要取地址一下 res = &model.xxx ,才能够查询呢,如果直接Find(&res) 就会提示 unsupported destination, should be slice or struct。
是因为切片类型的结构体已经初始化了,而指针类型的结构体需要用字面量{}` 初始化吗
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
reflect角度分析
没用过orm,但是我感觉可以从反射的角度解答下。
方法2res是空指针,res执行的地址是0为空,那么反射无法修改数据对象,那么用过下列四种方法初始化后均可以修改对象了;
res = &model.StProduct....
res给指针赋值了,指向了地址0xn,那么find(res)中res指针是有效的可以修改属性。res = new(model)
res同样给指针初始化了不指向了0,所以也可以find(res)var res model.StProduct...
,这样的res是一个结构体,&res得到的是一个指向res的指针,同样地址指向非空可设置。var res *model.StProduct
,&res得到的二重指针,地址非空可设置。gorm源码分析
https://github.com/jinzhu/gor...
判断了scope的value的reflec.Indirect(reflect.ValueOf(...)).Kind()的类型是否是Slice或Struct,但是空指针返回的kind为invalid,所以触发报错。
scope部分实现的IndirectValue方法,等于
return reflec.Indirect(reflect.ValueOf((scope.Value))
。一个damo返回了空指针解除全部引用后的Kind。
https://play.golang.org/p/1ft...
end
综上所述传入参数是空指针无法修改数据导致的报错。
切片是引用类型 (本身就是个指针),struct 是值类型。所以struct 需要取两次指针。