ошибка в mgo: результат не имеет поля или метода

У меня есть следующий код

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?

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


person user977828    schedule 14.03.2013    source источник


Ответы (2)


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

Я никогда не использовал mgo, но кажется, что под капотом он использует кодировку/json. Если это так, вы можете определить структуру , которая соответствует структуре вашего JSON и кодировки/ json сможет преобразовать в него ответ mgo.

person Thomas Kappler    schedule 14.03.2013
comment
результат[mw] выдал следующую ошибку: ./chemeo.go:78: недопустимая операция: результат[mw] (индекс типа *map[string]interface {}) - person user977828; 15.03.2013
comment
Это потому, что результат - это не карта, а указатель на карту, извините, что я не прочитал достаточно внимательно. Вы должны сначала разыменовать его: (*result)["mw"]. Вы также можете для удобства присвоить разыменованное значение новой переменной: result2 := *result. - person Thomas Kappler; 15.03.2013
comment
Не волнуйтесь. Спасибо, это работает. Как получается, что результат не меняет карту? Или результат получает адрес из метода Find, где сохранен запрос запроса? - person user977828; 16.03.2013

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

fmt.Println("mw:", result["mw"])
person zzzz    schedule 14.03.2013
comment
результат[mw] выдал следующую ошибку: ./chemeo.go:78: недопустимая операция: результат[mw] (индекс типа *map[string]interface {}) - person user977828; 15.03.2013