Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 去戈姆图书馆_Reflection_Go_Orm_Go Gorm - Fatal编程技术网

Reflection 去戈姆图书馆

Reflection 去戈姆图书馆,reflection,go,orm,go-gorm,Reflection,Go,Orm,Go Gorm,我正在使用gorm包()作为我在golang的数据库库。我有很多类(数据库表),比如“Hotel”或“Package”。复制代码不是好的编程实践。举个愚蠢的例子——假设我想从每个表中获取第一个对象。我可以为每个对象编写此方法(GetFirstHotel,GetFirstPackage…)。但更好的方法是只使用一个方法GetFirstItem,在这个方法中,我将使用first param创建与参数具有相同类的对象,然后将其传递给gorm,gorm将用数据库中的数据填充它,然后将其作为接口{}返回。

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

也许我只是没有在gorm库中发现一些函数,或者我不能正确使用reflect包。我应该如何实现
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
}

First方法返回db引用并将行分解为传递的结构

最接近您想要的方法是

func GetFirstItem(item interface{}) error {
    return db.First(item).Error
}
这只需要保留对参数的引用

var firstHotel &Hotel{}
err := GetFirstItem(firstHotel)
返回所有类型的水合对象需要类型参数(泛型)。我想你会发现目前的情况是可行的


另请参见:

db.First方法返回db引用并将行分解为传递的结构

最接近您想要的方法是

func GetFirstItem(item interface{}) error {
    return db.First(item).Error
}
这只需要保留对参数的引用

var firstHotel &Hotel{}
err := GetFirstItem(firstHotel)
返回所有类型的水合对象需要类型参数(泛型)。我想你会发现目前的情况是可行的

另见: