[英]Go reflect with gorm library
我正在使用gorm軟件包( https://github.com/jinzhu/gorm )作為我在golang中的數據庫庫。 我有很多類(數據庫表),例如“ Hotel”或“ Package”。 復制代碼不是好的編程習慣。 作為一個愚蠢的例子-假設我想從每個表中獲取第一個對象。 我可以為每個對象編寫此方法( GetFirstHotel
, GetFirstPackage
...)。 但是更好的方法是只有一個方法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
}
db.First方法返回db引用,並將行合並為傳遞的結構。
最接近所需方法的是
func GetFirstItem(item interface{}) error {
return db.First(item).Error
}
這只是需要保留對參數的引用
var firstHotel &Hotel{}
err := GetFirstItem(firstHotel)
返回所有類型的水合對象將需要類型參數(泛型)。 我認為您會發現當前情況在一定范圍內是可行的。
另請參閱: 為什么Go中沒有泛型?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.