为了账号安全,请及时绑定邮箱和手机立即绑定

去反射 gorm 库

去反射 gorm 库

Go
莫回无 2021-12-13 18:33:53
我在 golang 中使用 gorm 包(https://github.com/jinzhu/gorm)作为我的数据库库。我有很多类(数据库表),比如“酒店”或“包”。复制代码不是好的编程习惯。作为一个愚蠢的例子 - 假设我想从每个表中获取第一个对象。我可以为每个对象编写这个方法 ( GetFirstHotel, GetFirstPackage...) 。但更好的方法是只有一个方法GetFirstItem,我将使用第一个 param 创建与参数具有相同类的对象,然后将其传递给 gorm,后者将用数据库中的数据填充它,然后将其作为interface{}. 我尝试为此使用反射,但失败了,因为我可能不太了解它。也许我只是没有发现 gorm 库中的某些功能,或者我无法正确使用反射包。我应该如何实现GetFirstItem功能。是否有可能实现这个,或者我应该重复我的代码?package mainimport (    "github.com/jinzhu/gorm")var db gorm.DBtype 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 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

db.First 方法返回 db 引用并将行混合到传递的结构中。


最接近您想要的方法是


func GetFirstItem(item interface{}) error {

    return db.First(item).Error

}

这仅需要您保留对参数的引用


var firstHotel &Hotel{}

err := GetFirstItem(firstHotel)

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


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信