golangのデータベース ライブラリとしてgorm パッケージ ( https://github.com/jinzhu/gorm ) を使用しています。「ホテル」や「パッケージ」など、多くのクラス (データベース テーブル) があります。コードを複製することは、良いプログラミング方法ではありません。ばかげた例として、各テーブルから最初のオブジェクトを取得したいとします。オブジェクトごとにこのメソッド ( GetFirstHotel
, ...) を書くことができます。GetFirstPackage
しかし、より良い方法はGetFirstItem
、最初の param を使用してパラメーターと同じクラスのオブジェクトを作成し、それを gorm に渡すメソッドを1 つだけ持つことinterface{}
です。そのために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
}