1

我是 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)handleUsergo handleUser(db, &result)中的第二个查询,则不会执行任何操作。

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

4

1 回答 1

7

你是对的specs,他们定义当 main 返回时,所有的 goroutine 都被杀死:

当 main 函数返回时,程序退出。它不会等待其他(非主)goroutine 完成。

有两种选择。

  • 在 main 结束时与你的 goroutine 同步。可以使用“完成”的 chanel 或sync.WaitGroup.

  • 在适当的情况下,可以使用阻塞的空 select 语句:

    select{} // Non busy block forever

于 2013-04-15T09:42:03.227 回答