簡體   English   中英

去反射與gorm庫

[英]Go reflect with gorm library

我正在使用gorm軟件包( https://github.com/jinzhu/gorm )作為我在golang中的數據庫庫。 我有很多類(數據庫表),例如“ 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
}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM