2016-08-01 11 views
0

Я очень запутался в разных типах Go, но у меня есть строго определенная структура «VMR», и я пытаюсь выполнить преобразование данных к нему.интерфейс преобразование: интерфейс карта [строка] интерфейс {} не

Я запрашиваю CouchDB (используя Go SDK), а затем пытаюсь утвердить возвращенные данные в мою структуру. Конечно, это не работает, и это вызывает панику. Я стреляю в темноту, пытаясь понять, что я делаю неправильно.

Вот моя функция/структура:

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

Полный выход:

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]]

Ошибка:

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

В чем ваш тип 'models.VMR'? Можете ли вы опубликовать свое заявление? – icza

+3

Почему бы не 'rows.One (& vmr)' –

ответ

0

viewResults.One(interface{}) вызов оберткой Next(interface{}) который вызывает json.Unmarshal под обложками: Github link to relevant code. Если вы предложите interface{} объект до Unmarshal, он вернет вам map[string]interface{}, потому что у него нет другого выбора. Попробуйте следующее:

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

return row 

... и это должно правильно обработать Unmarshal.

Смежные вопросы