卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34952本站已运行393

如何从 Gorm 对象获取列名称和值?

如何从 gorm 对象获取列名称和值?

php小编草莓在编程开发中,我们经常会使用Gorm对象进行数据库操作。而有时候,我们需要从Gorm对象中获取列名称和对应的值。那么,如何实现这个需求呢?在Gorm中,我们可以通过反射来获取对象的属性和值,并结合Gorm的标签来获取列名称。接下来,我将为大家详细介绍如何从Gorm对象中获取列名称和值的方法。让我们一起来看看吧!

问题内容

我想编写一个函数,它可以获取从数据库加载的任何对象(通过 gorm)并打印出所有列名称和值。显然,关键部分是将我的任何 Gorm 模型传递到此函数中的能力。我没有在下面展示这些,因为它们都很简单。

到目前为止,我拥有的是一个带有接口的函数,以及一些调用它的测试代码:

func testfunc(s interface{}) {

    // type
    v := reflect.TypeOf(s)

    fmt.Println(v)

    // fields?
    for i := 0; i < v.NumField(); i++ {
        fmt.Println(i)
    }
}
trans := make([]orm.Trans, 0)

    db.Where("state = ?", state.FINISHED).Limit(1).Find(&trans)

    testfunc(trans)

运行时,会打印出类型,然后出现恐慌:

[]orm.Trans
panic: reflect: call of reflect.Value.NumField on slice Value

我是个新手,所以欢迎你的想法。看来我可能的选择是:

  • 使用反射(如果适用于切片)
  • 以某种方式查找模型中的字段?
  • 还有其他想法吗?

谢谢。

解决方法

尝试这种方法:

func testfunc(x interface{}){
        v := reflect.ValueOf(x)
        s := reflect.TypeOf(x)
        names:=make([]interface{},v.NumField())
        values := make([]interface{}, v.NumField())

        for i := 0; i < v.NumField(); i++ {
                values[i] = v.Field(i).Interface()
                names[i] = s.Field(i).Name
        }
        fmt.Println("Names",names)
        fmt.Println("values",values)

}

1-您正在传递结构体切片。(如果使用切片,请避免在循环中调用上面的函数。)

2-我正在将此结构传递给上面的函数

x := struct {
                Name string
                Id int
        }{"Zargham", 2}

3-获取输出:-

Names [Name Id]
values [Zargham 2]
卓越飞翔博客
上一篇: Docker:“go.mod 文件未找到”,当它明显存在时
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏