mgo中出错:结果没有字段或方法
我有以下代码mgo中出错:结果没有字段或方法,go,mgo,Go,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 { pani
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)
我怎样才能打印出来
提前感谢。
result
是一个映射[string],因此您可以使用result[“mw”]
访问该值。此映射条目的值将是类型interface{}
,这是Go最常用的类型,因此您必须将其转换为float才能使用它。看
我从未使用过mgo,但它似乎在幕后使用了encoding/json。如果是这样,您可以定义一个encoding/json,它将能够将mgo的响应解组到其中 不幸的是,我从未使用过mgo,但看到错误消息,我可能会尝试
fmt.Println("mw:", result["mw"])
结果[“mw”]产生了以下错误:“./chemeo.go:78:无效操作:结果[“mw”](类型*映射[字符串]接口{})的索引)“这是因为结果不是映射,而是指向映射的指针,很抱歉我没有仔细阅读。您必须首先取消对它的引用:
(*result)[“mw”]
。为了方便起见,您还可以将取消引用的值分配给新变量:result2:=*result
。不用担心。谢谢,它正在工作。为什么结果不会改变地图?或者result是否从保存查询的Find方法中获取地址?result[“mw”]生成以下错误:“./chemeo.go:78:无效操作:result[“mw”](类型为*map[string]interface{}的索引)”