gpt4 book ai didi

reflection - 使用 gorm 库进行反射(reflect)

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:26 32 4
gpt4 key购买 nike

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

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

最佳答案

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

最接近你想要的方法是

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

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

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

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

另请参阅:Why no generics in Go?

关于reflection - 使用 gorm 库进行反射(reflect),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414556/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com