2016-02-15 34 views
0

我使用gorm包(https://github.com/jinzhu/gorm)作爲我在golang的數據庫庫。我有很多類(數據庫表),如「酒店」或「包」。重複的代碼不是很好的編程習慣。作爲一個愚蠢的例子 - 讓我們假設我想從每個表中獲取第一個對象。我可以爲每個對象編寫此方法(​​,GetFirstPackage ...)。但更好的辦法是隻有一個方法GetFirstItem,我將使用第一個參數創建與參數相同的類的對象,然後將其傳遞給gorm,它將填充數據庫中的數據,然後將其返回爲interface{}。我試圖用反映,但失敗了,因爲我可能不太瞭解它。Go反映與格姆庫

也許我只是沒有在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 
} 

回答

2

db.First方法返回數據庫引用並將行保存到傳遞的結構中。

最接近您所需的方法是

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

這僅僅需要你保持一個參考參數

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

返回所有的類型,將需要的類型參數(仿製藥)的脫水對象。我想你會發現目前的情況在限制範圍內是可行的。

另請參閱:Why no generics in Go?