登录
首页 >  Golang >  Go问答

golang gorm查询报错,返回值参数一个是,切片指针类型的结构体和指针类型结构体

来源:SegmentFault

时间:2023-01-19 15:28:19 449浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《golang gorm查询报错,返回值参数一个是,切片指针类型的结构体和指针类型结构体》,主要介绍了gorm,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

图片.png

第一个函数返回的是切片类型的结构体,结构体都是指针类型
第二个函数返回的是结构体指针类型。

两个函数都定义返回变量为什么第一个函数Find(&xxx)就可以,
为什么第二个函数需要取地址一下 res = &model.xxx ,才能够查询呢,如果直接Find(&res) 就会提示 unsupported destination, should be slice or struct。

是因为切片类型的结构体已经初始化了,而指针类型的结构体需要用字面量

 
{}` 初始化吗

正确答案

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,所以触发报错。

    results = scope.IndirectValue()
    // ...
    if kind := results.Kind(); kind == reflect.Slice {
        // ...
    } else if kind != reflect.Struct {
        scope.Err(errors.New("unsupported destination, should be slice or struct"))
        return
    }

scope部分实现的IndirectValue方法,等于

return reflec.Indirect(reflect.ValueOf((scope.Value))

// IndirectValue return scope's reflect value's indirect value
func (scope *Scope) IndirectValue() reflect.Value {
    return indirect(reflect.ValueOf(scope.Value))
}

一个damo返回了空指针解除全部引用后的Kind。

https://play.golang.org/p/1ft...

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var i *int
    fmt.Println(reflect.Indirect(reflect.ValueOf(i)).Kind())
    fmt.Println("Hello, playground")
}

end

综上所述传入参数是空指针无法修改数据导致的报错。

理论要掌握,实操不能落!以上关于《golang gorm查询报错,返回值参数一个是,切片指针类型的结构体和指针类型结构体》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表