我在golang中使用gorm包(https://github.com/jinzhu/gorm)作为我的数据库库 . 我有很多类(数据库表),如"Hotel"或"Package" . 复制代码不是很好的编程习惯 . 作为一个愚蠢的例子 - 让我们假设我想从每个表中获取第一个对象 . 我可以为每个对象编写这个方法( GetFirstHotel
, GetFirstPackage
...) . 但更好的方法是只使用一个方法 GetFirstItem
,我将使用第一个参数创建具有相同类作为参数的对象,然后将其传递给gorm,它将使用数据库中的数据填充它,然后将其作为 interface{}
返回 . 我尝试使用反射,但失败了,因为我可能不太了解它 .
也许我只是没有't discover some function in gorm library, or I can' t正确使用反射包 . 我该如何实现 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
}
1 回答
db.First方法返回db引用并将行水合成传递的结构 .
最接近您想要的方法是
这只需要您保持对参数的引用
返回所有类型的水合物体将需要类型参数(泛型) . 我想你会发现目前的情况在极限范围内是可行的 .
另见:Why no generics in Go?