Go反映与格姆库

问题描述:

我使用gorm包(https://github.com/jinzhu/gorm)作为我在golang的数据库库。我有很多类(数据库表),如“酒店”或“包”。重复的代码不是很好的编程习惯。作为一个愚蠢的例子 - 让我们假设我想从每个表中获取第一个对象。我可以为每个对象编写此方法(​​,GetFirstPackage ...)。但更好的办法是只有一个方法GetFirstItem,我将使用第一个参数创建与参数相同的类的对象,然后将其传递给gorm,它将填充数据库中的数据,然后将其返回为interface{}。我试图用反映,但失败了,因为我可能不太了解它。Go反映与格姆库

也许我只是没有在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方法返回数据库引用并将行保存到传递的结构中。

最接近您所需的方法是

func GetFirstItem(item interface{}) error { 
    return db.First(item).Error 
} 

这仅仅需要你保持一个参考参数

var firstHotel &Hotel{} 
err := GetFirstItem(firstHotel) 

返回所有的类型,将需要的类型参数(仿制药)的脱水对象。我想你会发现目前的情况在限制范围内是可行的。

另请参阅:Why no generics in Go?