2014-02-15 19 views
12

ich eine Funktion wie unter dem haben decodiert einige JSON-Daten und gibt sie als Schnittstellegolang wie Schnittstelle den Zugriff auf Felder

package search 

func SearchItemsByUser(r *http.Request) interface{} { 

    type results struct { 
     Hits    hits 
     NbHits   int 
     NbPages   int 
     HitsPerPage  int 
     ProcessingTimeMS int 
     Query   string 
     Params   string 
    } 

    var Result results 

    er := json.Unmarshal(body, &Result) 
    if er != nil { 
     fmt.Println("error:", er) 
    } 
    return Result 

} 

Ich versuche, die Datenfelder (zB Params) zuzugreifen, aber aus irgendwelchen Gründen es sagt, dass die Schnittstelle kein solches Feld hat. Irgendeine Idee warum?

+1

Warum geben Sie 'interface {}' und nicht '* results' zurück? –

Antwort

14

Eine Schnittstellenvariable kann verwendet werden, um alle Werte zu speichern, die der Schnittstelle entsprechen, und Methoden aufzurufen, die Teil dieser Schnittstelle sind. Beachten Sie, dass Sie nicht über eine Schnittstellenvariable auf Felder des zugrunde liegenden Werts zugreifen können.

In diesem Fall gibt Ihre SearchItemsByUser-Methode einen interface{}-Wert (d. H. Die leere Schnittstelle) zurück, der einen beliebigen Wert enthalten kann, aber keinen direkten Zugriff auf diesen Wert bietet. Sie können den dynamischen Wert durch die Schnittstelle Variable durch eine Art Behauptung gehalten extrahieren, etwa so:

dynamic_value := interface_variable.(typename) 

Abgesehen davon, dass in diesem Fall die Art des dynamischen Wert auf Ihre SearchItemsByUser Methode privat. Ich würde vorschlagen, zwei Änderungen an Ihrem Code machen:

  1. Definieren Sie Ihre results Typ auf der obersten Ebene, anstatt innerhalb der Methode Körper.

  2. Geben Sie SearchItemsByUser direkt einen Wert results anstelle von interface{} zurück.

+0

Ich sehe nicht wirklich, wie ich die Ergebnisklasse (Typ) auf der obersten Ebene definieren könnte, da es Treffer vom Typ Treffer gibt. Fehle ich etwas? SearchItemsByUser scheint keine leere Schnittstelle zurückzugeben. Wenn ich Ergebnis von der Testfunktion (fmt.Fprintf (w, "% s", Ergebnis)) drucke, erhalte ich etwas, das den benötigten Daten sehr ähnlich sieht (zB test0%! S (int = 3) mihai/test0/0}]%! S (int = 1)%! S (int = 1)%! S (int = 10)%! S (int = 1) attributesToHighlight) – themihai

+0

Sie haben die Funktion zum Zurückgeben der 'Schnittstelle {} definiert. '- das ist die leere Schnittstelle. Auf der obersten Ebene, meine ich auf der Paketebene, anstatt in die Methode eingebettet. Was hat der Typ "Hits" damit zu tun? –

+0

@mihai Natürlich gibt 'searchItemsByUser' eine leere Schnittstelle zurück! Du hast es so erklärt! Der Wert ist immer noch da, aber es ist "_behind_" die Schnittstelle. Sie können den Wert dennoch extrahieren (oder ihn auf eine andere Schnittstelle umwandeln), was 'fmt.Fprintf' tut. – Cubic

Verwandte Themen