Golang在尝试使方法并发时不返回任何内容

Golang在尝试使方法并发时不返回任何内容,go,Go,我有一个从数据库返回Json的方法,它工作正常,但是当我尝试使其并发时,它不会返回任何内容,也不会给出任何错误。例如,这就是正确工作的方法 func Listing_Expiration(w http.ResponseWriter, r *http.Request) { db,err := sql.Open("DB_Connect") if err != nil { log.Fatal(err) println

我有一个从数据库返回Json的方法,它工作正常,但是当我尝试使其并发时,它不会返回任何内容,也不会给出任何错误。例如,这就是正确工作的方法

func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {

        db,err := sql.Open("DB_Connect")

        if err != nil {
            log.Fatal(err)
            println(err)
        }



        var result string

        errr := db.QueryRow("select json_build_object('Expiration', array_to_json(array_agg(t))) from (select fullname,ad_end from profiles where id=32)t").Scan(&result)


        defer db.Close()
        switch {
        case errr != nil:
            log.Fatal(errr)


        }


        fmt.Fprintf(w,result)

}
上面的方法工作正常,数据返回到浏览器,然后我尝试使此方法异步

 func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {
        go func(){

            db,err := sql.Open("DB_Connect")

            if err != nil {
                log.Fatal(err)
                println(err)
            }



            var result string

            errr := db.QueryRow("select json_build_object('Expiration', array_to_json(array_agg(t))) from (select fullname,ad_end from profiles where id=32)t").Scan(&result)


            defer db.Close()
            switch {
            case errr != nil:
                log.Fatal(errr)


            }


            fmt.Fprintf(w,result)

        }()
    }

上面的async没有返回任何内容。我唯一更改的是在方法中添加了Go func(),因此它是异步的,其他所有内容都是相同的。我检查了,数据库正在返回相同的内容,但我不知道为什么异步程序没有将结果打印回浏览器。

当处理程序返回时,net/http服务器完成响应。处理程序返回后写入响应的任何内容都将被忽略

在匿名函数执行之前,处理函数
列表\u Expiration
将返回
fmt.Fprintf(w,result)

要解决此问题,请使用:


net/http服务器为每个连接启动一个goroutine,并在这些goroutine中运行处理程序。如果问题中的代码是完整的处理程序,那么就没有理由再启动另一个goroutine。

很好,我现在要阅读文档,所以基本上每当我使用打印到浏览器的goroutine时,都要使用WaitGoup,对吗?如果应用程序从goroutine写入响应,然后应用程序必须做一些事情来确保处理程序等待goroutine。WaitGroup是一种方便的方法。也可以使用通道。为了避免响应编写器上的争用,通常最好从处理程序的goroutine写入响应。在这个例子中,这不是问题,但是考虑一下如果应用程序运行两个查询异步会发生什么。非常感谢它的完美解释,我现在将重写Goroutine handler的回复。
func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {
  var wg sync.WaitGroup
  wg.Add(1)
  go func(){
    defer wg.Done()
    // same code here as in question
  }()
  wg.Wait()
}