0

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
}
4

1 に答える 1

2

db.First メソッドは db 参照を返し、行を渡された構造体にハイドレートします。

希望する方法に最も近いのは

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

これには、パラメーターへの参照を保持する必要があるだけです

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

すべての型の水和オブジェクトを返すには、型パラメーター (ジェネリック) が必要です。現在の状況は制限内で実行可能であることがわかると思います。

参照: Go にジェネリックがないのはなぜですか?

于 2016-02-16T08:11:17.307 に答える