2017-02-04 3 views
1

Das Basiskonzept Erstellen einer Database Manager API zum Abrufen von Daten über eine API. Ich verwende den GORM, um Daten der Instanzen der Structs zu erhalten. Also gibt es 300-400 Struktur, die die Tabellen darstellt.Golang Datenbankmanager API-Konzept, Fehler bei Typ Assertion

type Users struct { 
    ID int64 
    Name string 
} 

type Categories struct { 
    ID int64 
    Category string 
} 

Der nächste Schritt, den ich eine Funktion implementieren, die von Tabellennamen die richtige Instanz der Struktur ist zurückgeben, was ich über die API-Endpunkt param erhalten.

func GetModel(model string) interface{} { 
    switch model { 
    case "users": 
    return Users{} 
    case "categories" 
    return Categories{} 
    } 
    return false 
} 

Nach gibt es eine Operations-Struktur, wo das einzige Feld der DB ist. Es gibt Methoden, zum Beispiel die GetLast(), wo ich die GORM db.Last (& Benutzer) -Funktion verwenden möchte.

func (o Operations) GetLast(model string) interface{} { 
    modelStruct := GetModel(model) 
    . 
    . 
    . 
    return o.DB.Last(&modelStruct) 
} 

Es gibt Punkte, also ist das, was ich nicht weiß. Die aktuelle Lösung funktioniert nicht, da es sich in diesem Fall um eine Schnittstelle handelt {} Ich muss eine Typbestätigung machen more info in this question. Die Typ-Assertion sieht wie folgt aus:

func (o Operations) GetLast(model string) interface{} { 
    modelStruct := GetModel(model) 
    . 
    test := modelStruct.(Users) 
    . 
    return o.DB.Last(&test) 
} 

Diese Lösung funktioniert, aber in diesem Fall habe ich die Modularität verloren. Ich versuche mit der reflect.TypeOf(modelStruct), aber es funktioniert auch nicht, weil das Ergebnis der reflect.TypeOf ist ein reflect.Type, mit ist kein Golang-Typ.

Antwort

0

Im Grunde habe ich das Problem gelöst, um das Modell als Zeiger zu bekommen, und nachdem ich es als JSON-Datei zurückgeben.

Also mein Modell ist folgendes:

var Models = map[string]interface{}{ 
    "users": new(Users), 
    "categories": new(Categories), 
} 

Und es ist ein neues Modell von Tabellentyp wieder zurück. was ich für die gorm First() -Funktion verwenden kann. Dann json Marshal, und zurück.

Vor der Rückgabe lösche ich den Modellzeiger, weil die Funktion First() Callbacks für die letzten Abfragen speichert.

func clear(v interface{}) { 
    p := reflect.ValueOf(v).Elem() 
    p.Set(reflect.Zero(p.Type())) 
} 
Verwandte Themen