猿问

如何将 MongoDB 数据库传递给 GO 例程?

我是 Go 的新手,我正在尝试编写一个简单的程序,该程序遍历 MongoDB 数据库中的所有用户,并使用 'mgo' 包为每个用户遍历他的所有帖子。


package main


import (

    "fmt"

    "labix.org/v2/mgo"

    "labix.org/v2/mgo/bson"

)


type User struct {

    Id string

    Email string

}


type Post struct {

    Id string

    Description string

}


func handleUser(db *mgo.Database, user *User) {

    fmt.Println("ID: ", user.Id, " EMAIL: ", user.Email)


    result := Post{}


    iter := db.C("posts").Find(bson.M{"user_id": user.Id}).Iter()


    for iter.Next(&result) {

        fmt.Println("POST ID: ", result.Id, " POST DESCRIPTION: ", result.Description)

    }

}


func main() {

    session, err := mgo.Dial("localhost")


    if err != nil {

        panic(err)

    }


    defer session.Close()


    db := session.DB("mydb")


    result := User{}


    iter := db.C("users").Find(nil).Iter()

    for iter.Next(&result) {

        handleUser(db, &result)

    }   

}

这工作得很好,但如果我尝试将呼叫改变handleUser(db, &result)到go handleUser(db, &result)里面handleUser第二个查询没有做任何事情。


我怀疑会话已经关闭,因为“主要”已经完成,我说得对吗?如果是这样,处理这种情况的方法是什么?


ITMISS
浏览 253回答 1
1回答

一只甜甜圈

你对specs是对的,它们定义了当 main 返回时,所有的 goroutine 都会被杀死:当函数 main 返回时,程序退出。它不会等待其他(非主)goroutine 完成。有两种选择。在 main 的末尾与你的 goroutine 同步。可以使用“完成”的 chanel 或sync.WaitGroup.在适当的情况下,可以使用阻塞的空 select 语句:select{} // Non busy block forever
随时随地看视频慕课网APP

相关分类

Go
我要回答