首页 文章

去反映与gorm库

提问于
浏览
0

我在golang中使用gorm包(https://github.com/jinzhu/gorm)作为我的数据库库 . 我有很多类(数据库表),如"Hotel"或"Package" . 复制代码不是很好的编程习惯 . 作为一个愚蠢的例子 - 让我们假设我想从每个表中获取第一个对象 . 我可以为每个对象编写这个方法( GetFirstHotelGetFirstPackage ...) . 但更好的方法是只使用一个方法 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 回答

  • 2

    db.First方法返回db引用并将行水合成传递的结构 .

    最接近您想要的方法是

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

    这只需要您保持对参数的引用

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

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

    另见:Why no generics in Go?

相关问题