我有以下代码,我不确定它为什么不返回一片Notes。我正在使用labix.org的mgo库连接到MongoDB并关注他们的在线文档。
type Note struct {
Url string
Title string
Date string
Body string
}
func loadNotes() ([]Note) {
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("notes")
notes := []Note{}
iter := c.Find(nil).Limit(100).Iter()
err = iter.All(¬es)
if err != nil {
panic(iter.Err())
}
return notes
}
func main() {
notes := loadNotes()
for note := range notes {
fmt.Println(note.Title)
}
}
如果我只是打印出来notes
我看起来像是两个结构的片段,但我无法通过notes.Title
或类似的方式访问它们。
[{ Some example title 20 September 2012 Some example content}]
这就是我的文件:
> db.notes.find()
{ "_id" : "some-example-title", "title" : "Some example title", "date" : "20 September 2012", "body" : "Some example content" }
真正的问题是,它将笔记作为一个大片而非Note{}
(我认为?)
如果我做的事情显然是错误的,那么任何见解都会有所帮助。
答案 0 :(得分:4)
你的问题在这里:
for note := range notes {
fmt.Println(note.Title)
}
应该是:
for _, note := range notes {
fmt.Println(note.Title)
}
在切片上使用范围语句返回形式为i, v
的对,其中i是切片中的索引,v是该切片中索引处的项。由于您省略了第二个值,因此您将循环索引,而不是Note
值。
它位于规范的RangeClause部分:http://golang.org/ref/spec#RangeClause
答案 1 :(得分:2)
看起来它对我有用。笔记是你指出的结构片段。
for _, n := range notes {
n.Title // do something with title
n.Url // do something with url
}
或者如果您只想要第一个:
notes[0].Title
也应该有用。
一段结构不能被索引,好像它本身就是结构,因为它不是结构。
答案 2 :(得分:0)
iter.All()一次将整个结果集检索到切片中。如果您只想要一行,请使用iter.Next()。见https://groups.google.com/forum/#!msg/mgo-users/yUGZi70ik9Y/J8ktshJgF7QJ