2016-11-18 6 views
2

Zunächst einmal bin ich etwas über einem Anfänger in Go und brauche ein wenig Hilfe. Ich dachte, ich behauptet habe (so weit ich gehen habe gelernt), aber ich halte diesen Fehler cannot use readBack["SomePIN"] (type interface {}) as type string in argument to c.String: need type assertionERROR: Notwendigkeit Typ Assertion

Hier mein Code (dieser Ausschnitt ist aus einer Handler-Funktion anfordern und ich bin mit Echo-Web-Framework und tiedot NoSQL-Datenbank)

// To get query result document, simply 
// read it [as stated in the Tiedot readme.md] 
for id := range queryResult { 
    readBack, err := aCollection.Read(id) 
    if err != nil { 
     panic(err) 
    } 
    if readBack["OtherID"] == otherID { 
     if _, ok := readBack["SomePIN"].(string); ok { 
      return c.String(http.StatusOK, readBack["SomePIN"]) 
     } 
    } 
} 

Antwort

6

Sie behaupten readBack["SomePIN"] als Zeichenkette - in der if Anweisung. Das ändert jedoch nichts an readBack["SomePIN"] - es ist immer noch eine Schnittstelle {}. In Go ändert nichts den Typ. Folgendes wird funktionieren:

Sie haben den Zeichenfolgenwert aus Ihrer Typassertion geworfen, aber Sie möchten ihn. Also behalte es, wie somePIN, und dann benutze es.

Abschließende Notiz - mit der value, ok = interfaceVal.(type) Syntax ist eine gute Übung. Wenn sich interfaceVal als kein String herausstellt, erhalten Sie value = "" und ok = false. Wenn Sie den OK-Wert aus der Typ-Assertion entfernen und interfaceVal eine Nicht-Zeichenfolge ist, wird das Programm in Panik versetzt.

3

Es sieht aus wie Ihr auf einen konkreten Typ Umwandlung und die Umwandlung wegzuwerfen, ich denke, das sollte funktionieren:

if somePinString, ok := readBack["SomePIN"].(string); ok { 
     return c.String(http.StatusOK, somePinString) 
    }