2013-03-14 4 views
1

У меня есть следующий кодошибка в МдО: результат не имеет поля или метод

package main 

import (
    "encoding/json" 
    "fmt" 
    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
) 

func insertEntry(j *map[string]interface{}, entry string) { 
    err := json.Unmarshal([]byte(entry), j) 
    if err != nil { 
     panic(err) 
    } 

} 

func main() { 
    c1 := `{ 
    "mw" : 42.0922, 
     "ΔfH°gas" : { 
      "value" : 372.38, 
      "units" : "kJ/mol" 
     }, 
     "S°gas" : { 
      "value" : 216.81, 
      "units" : "J/mol×K" 
     }, 
     "index" : [ 
      {"name" : "mw", "value" : 42.0922}, 
      {"name" : "ΔfH°gas", "value" : 372.38}, 
      {"name" : "S°gas", "value" : 216.81} 
     ] 
     }` 

    c2 := `{ 
    "name": "silicon", 
    "mw": 32.1173, 
    "index": [ 
    { 
     "name": "mw", 
     "value": 32.1173 
    } 
    ] 
    }` 

    var m map[string]interface{} 

    insertEntry(&m, c1) 
    insertEntry(&m, c2) 
    chemical := m["ΔfH°gas"].(map[string]interface{}) 
    fmt.Println("value: ", chemical["value"].(float64)) 
    fmt.Println("units: ", chemical["units"].(string)) 

    session, err := mgo.Dial("localhost") 

    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 

    // Optional. Switch the session to a monotonic behavior. 
    session.SetMode(mgo.Monotonic, true) 

    c := session.DB("test").C("chemicals") 
    err = c.Insert(&m) 
    if err != nil { 
     panic(err) 
    } 

    result := &m 
    err = c.Find(bson.M{"name": "silicon"}).One(&result) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Println(result) 
    fmt.Println("mw:", result.mw) 
} 

и получил следующее сообщение об ошибке

$ go run chemeo.go 
# command-line-arguments 
./chemeo.go:78: result.mw undefined (type *map[string]interface {} has no field or method mw) 

Как я могу напечатать Mw вне дома?

Заранее спасибо.

ответ

2

result - это карта [строка], поэтому вы можете получить доступ к значению с помощью result["mw"]. Значение этой записи карты будет иметь тип interface{}, наиболее общий тип Go, поэтому вам нужно будет преобразовать его в float, чтобы использовать его. См. type conversions.

Я никогда не использовал mgo, но, похоже, он использует кодировку/json под капотом. Если это так, вы можете определить struct that matches the structure of your JSON, и кодировка/json сможет отключить ответ mgo.

+0

результат [ «МВТ»] производится следующее сообщение об ошибке:»./chemeo.go:78: недопустимой операции: result ["mw"] (индекс типа * map [string] interface {}) " – user977828

+0

Это потому, что результат - это не карта, а указатель на карту, извините, что я не читал достаточно близко. Сначала вы должны разыменовать его: '(* result) [" mw "]'. Вы также можете назначить разыменованное значение новой переменной для удобства: 'result2: = * result'. –

+0

Не беспокойтесь. Спасибо, что он работает. Как получается, что результат не меняет карту? Или результат получает адрес из метода «Найти», где сохраняется запрос запроса? – user977828

0

К сожалению, я никогда не использовал МдО, но, глядя на сообщение об ошибке, я бы, вероятно, попытается

fmt.Println("mw:", result["mw"]) 
+0

результат ["mw"] вызвал следующую ошибку: "./chemeo.go:78: недействительная операция: результат [" mw "] (индекс типа * map [string] interface {})" – user977828