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]
以上就是如何从 Gorm 对象获取列名称和值?的详细内容,更多请关注编程网其它相关文章!