[英]Go reflect with gorm library
我正在使用gorm软件包( https://github.com/jinzhu/gorm )作为我在golang中的数据库库。 我有很多类(数据库表),例如“ Hotel”或“ Package”。 复制代码不是好的编程习惯。 作为一个愚蠢的例子-假设我想从每个表中获取第一个对象。 我可以为每个对象编写此方法( GetFirstHotel
, GetFirstPackage
...)。 但是更好的方法是只有一个方法GetFirstItem
,在这里我将使用第一个参数创建具有与参数相同的类的对象,然后将其传递给gorm,它将用数据库中的数据填充它,然后将其返回为interface{}
。 我尝试为此使用反射,但失败了,因为我可能不太了解。
也许我只是没有在gorm库中发现某些功能,或者我不能正确使用反射包。 我应该如何实现GetFirstItem
函数。 是否可以实现此功能,还是我应该重复我的代码?
package main
import (
"github.com/jinzhu/gorm"
)
var db gorm.DB
type Hotel struct {
ID int64
Name string
Lat float64
Lon float64
}
type Package struct {
ID int64
Name string
Text string
}
func GetFirstHotel() (hotel Hotel) {
db.First(&hotel)
}
func GetFirstPackage() (pack Package) {
db.First(&pack)
}
func main() {
var firstHotel, firstPackage interface{}
//first method
firstHotel = GetFirstHotel()
firstPackage = GetFirstPackage()
//method i want to use
firstHotel = GetFirstItem(Hotel{})
firstPackage = GetFirstItem(Package{})
}
func GetFirstItem(item interface{}) interface{} {
//how to implement this?
//probably with some use of reflect package
}
db.First方法返回db引用,并将行合并为传递的结构。
最接近所需方法的是
func GetFirstItem(item interface{}) error {
return db.First(item).Error
}
这只是需要保留对参数的引用
var firstHotel &Hotel{}
err := GetFirstItem(firstHotel)
返回所有类型的水合对象将需要类型参数(泛型)。 我认为您会发现当前情况在一定范围内是可行的。
另请参阅: 为什么Go中没有泛型?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.