我是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中的第二个查询不会执行任何操作。
我怀疑会话已经关闭,因为'main'已经完成,我是否正确?如果是这样,处理这种情况的方法是什么?
答案 0 :(得分:7)
你对specs是正确的,他们定义当主要回归时,所有goroutines都被杀死了:
当函数main返回时,程序退出。它不会等待其他(非主要)goroutines完成。
有两种选择。
在main结束时与你的goroutines同步。可以使用“完成”chanel或sync.WaitGroup
。
可以使用阻塞的空选择语句:
select{} // Non busy block forever