2016-08-01 7 views
0

Ich bin wirklich von all den verschiedenen Arten in Go verwirrt, aber ich habe eine streng definierte Struktur ‚VMR‘ und ich versuche, ein Konvertit Daten zu tun zu ihm.Schnittstelle Umwandlung: Schnittstelle ist map [string] Schnittstelle {} nicht

Ich Abfrage CouchDB (die Go-SDK) und dann zu versuchen, die zurückgegebenen Daten in meine Struktur zu behaupten. Natürlich funktioniert das nicht und es löst Panik aus. Ich schieße im Dunkeln und versuche herauszufinden, was ich falsch mache.

Hier ist meine Funktion/Struktur:

type VMR struct { 
    Name    string `json:"name,omitempty"` 
    InUse    bool `json:"inuse"` 
    Description  string `json:"description,omitempty"` 
    View    string `json:"view,omitempty"` 
    Theme    string `json:"theme,omitempty"` 
    Alias1    int `json:"alias1,omitempty"` 
    Alias1_Description string `json:"alias1_description,omitempty"` 
    Host_PIN   int `json:"host_pin,omitempty"` 
    Allow_Guests  bool `json:"allow_guests,omitempty"` 
    Guest_Pin   int `json:"guest_pin,omitempty"` 
    Alias2    int `json:"alias2,omitempty"` 
    Alias2_Description string `json:"alias2_description,omitempty"` 
} 

func Get() VMR { 
    cluster, _ := gocb.Connect("couchbase://ip:port") 
    bucket, _ := cluster.OpenBucket("bucket", "password") 
    myQuery := gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE name='test42' LIMIT 1") 
    rows, _ := bucket.ExecuteN1qlQuery(myQuery, nil) 

    var row interface{} 
    rows.One(&row) 
    fmt.Printf("Query1: %+v\n", row) 

    return row.(VMR) 
} 

Volle Leistung:

Query1: map[115:map[alias1_description:Alias 1 description alias2_description:Alias description description:This is the best VMR name:test42 view:ViewOption theme:Theme51 alias1:1 alias2:1 guest_pin:1 host_pin:1 inuse:false]]

Fehler:

panic: interface conversion: interface is map[string]interface {}, not models.VMR 
+1

Was ist Ihr 'models.VMR' Typ? Kannst du seine Erklärung abgeben? – icza

+3

warum nicht 'rows.One (& vmr)' –

Antwort

0

Der viewResults.One(interface{}) Anruf ein Wrapper um Next(interface{}) ist die Anrufe json.Unmarshal unter der Decke: Github link to relevant code. Wenn Sie ein interface{} Objekt Unmarshal anbieten, wird es Ihnen eine map[string]interface{} zurückgeben, da es keine andere Option hat. Versuchen Sie Folgendes:

var row VMR 
rows.One(&row) 
fmt.Printf("Query1: %+v\n", row) 

return row 

... und das sollte die Unmarshal richtig behandeln.