英文:
error in mgo: result has no field or method
问题
我有以下代码
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?
提前谢谢。
英文:
I have the following code
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)
}
and got the following error
$ go run chemeo.go
# command-line-arguments
./chemeo.go:78: result.mw undefined (type *map[string]interface {} has no field or method mw)
How could I print mw out?
Thank you in advance.
答案1
得分: 2
result
是一个 map[string]
,所以你可以通过 result["mw"]
来访问值。这个 map 条目的值将是 interface{}
类型,Go 的最通用类型,所以你需要将其转换为 float 类型才能使用。参见 类型转换。
我从未使用过 mgo,但它似乎在底层使用了 encoding/json。如果是这样的话,你可以定义一个与你的 JSON 结构匹配的结构体,然后 encoding/json 将能够将 mgo 的响应解组成它。
英文:
result
is a map[string], so you can access the value with result["mw"]
. The value of this map entry will be of type interface{}
, Go's most general type, so you will have to convert it to a float to use it. See type conversions.
I never used mgo, but it seems it uses encoding/json under the hood. If so, you can define a struct that matches the structure of your JSON and encoding/json will be able to unmarshal mgo's response into it.
答案2
得分: 0
很不幸,我从未使用过mgo,但是根据错误信息,我可能会尝试:
fmt.Println("mw:", result["mw"])
英文:
Unfortunately I never used mgo, but looking at the error message, I would probably try
fmt.Println("mw:", result["mw"])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论