0

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

也许我只是没有发现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
}
4

1 回答 1

2

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

最接近您想要的方法是

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

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

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

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

另请参阅:为什么 Go 中没有泛型?

于 2016-02-16T08:11:17.307 回答