3

私は次のコードを持っていますが、なぜそれが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(&notes)
    if err != nil {
        panic(iter.Err())
    }

    return notes
}

func main() {
    notes := loadNotes()
    for note := range notes {
        fmt.Println(note.Title)
    }
}  

印刷するだけnotesで、2つの構造体のスライスのように見えますが、そのような方法でそれらにアクセスすることはできません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{}本当の問題は、ノートを(私が思うに)ではなく、1つの大きなスライスとして返すことです。

私が明らかに間違ったことをしているなら、どんな洞察も助けになるでしょう。

4

3 に答える 3

5

あなたの問題はここにあります:

for note := range notes {
    fmt.Println(note.Title)
}

それは読むべきです:

for _, note := range notes {
    fmt.Println(note.Title)
}

スライスで range ステートメントを使用すると、 の形式のペアが返されますi, v。ここで、i はスライス内のインデックス、v はそのスライス内のインデックスの項目です。2 番目の値を省略したため、値ではなくインデックスをループしていNoteます。

仕様の RangeClause セクションにあります: http://golang.org/ref/spec#RangeClause

于 2012-09-24T16:17:51.253 に答える
2

それは私に働いているようです。あなたが示したように、メモは構造体のスライスです。

for _, n := range notes {
  n.Title // do something with title
  n.Url // do something with url
}

あるいは、最初のものだけが必要な場合: notes[0].Title同様に機能するはずです。

構造体のスライスは、構造体ではないため、それ自体が構造体であるかのようにインデックスを付けることはできません。

于 2012-09-24T13:27:20.060 に答える
0

iter.All() は、結果セット全体を一度にスライスに取得します。1 行だけが必要な場合は、iter.Next() を使用します。https://groups.google.com/forum/#!msg/mgo-users/yUGZi70ik9Y/J8ktshJgF7QJを参照

于 2012-09-24T09:17:54.233 に答える