我是 Go 的新手,我正在尝试编写一个简单的程序,该程序遍历 MongoDB 数据库中的所有用户,并使用 'mgo' 包为每个用户遍历他的所有帖子。package mainimport ( "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第二个查询没有做任何事情。我怀疑会话已经关闭,因为“主要”已经完成,我说得对吗?如果是这样,处理这种情况的方法是什么?
1 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
你对specs是对的,它们定义了当 main 返回时,所有的 goroutine 都会被杀死:
当函数 main 返回时,程序退出。它不会等待其他(非主)goroutine 完成。
有两种选择。
在 main 的末尾与你的 goroutine 同步。可以使用“完成”的 chanel 或
sync.WaitGroup
.在适当的情况下,可以使用阻塞的空 select 语句:
select{} // Non busy block forever
- 1 回答
- 0 关注
- 252 浏览
添加回答
举报
0/150
提交
取消