代码之家  ›  专栏  ›  技术社区  ›  Ondra

使用gorm库进行反思

  •  0
  • Ondra  · 技术社区  · 9 年前

    我正在使用gorm包( https://github.com/jinzhu/gorm )作为我在戈朗的数据库。我有很多类(数据库表),比如“Hotel”或“Package”。复制代码不是好的编程实践。作为一个愚蠢的例子,假设我想从每个表中获取第一个对象。我可以写这个方法( GetFirstHotel , GetFirstPackage …)。但更好的方法是只有一种方法 GetFirstItem ,其中我将使用第一个参数创建与参数类相同的对象,然后将其传递给gorm,gorm将用数据库中的数据填充它,然后将它返回为 interface{} 。我试着用reflect来表达,但失败了,因为我可能不太理解。

    也许我只是没有在gorm库中发现一些函数,或者我不能正确使用reflect包。我应该如何实施 获取第一项 作用有可能实现这一点吗?还是我应该重复我的代码?

    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 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    7 年前

    数据库。第一个方法返回db引用并将行水合到传递的结构中。

    最接近您期望的方法是

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

    这只需要保留对参数的引用

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

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

    另请参见: Why no generics in Go?